diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2c7c86896ec6b7662bf0927429666abe3e0fc912..48acc89b8d20808bb25ae986d0df45edb74731c6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -232,6 +232,8 @@ install(FILES mechanisms/generate_catalogue DESTINATION ${ARB_INSTALL_DATADIR} P
 # External libraries in `ext` sub-directory: json, tinyopt and randon123.
 # Creates interface libraries `ext-json`, `ext-tinyopt` and `ext-random123`
 
+cmake_dependent_option(ARB_USE_BUNDLED_FMT "Use bundled FMT lib." ON "ARB_USE_BUNDLED_LIBS" OFF)
+
 cmake_dependent_option(ARB_USE_BUNDLED_JSON "Use bundled Niels Lohmann's json library." ON "ARB_USE_BUNDLED_LIBS" OFF)
 if(NOT ARB_USE_BUNDLED_JSON)
   find_package(nlohmann_json)
@@ -239,9 +241,17 @@ if(NOT ARB_USE_BUNDLED_JSON)
 else()
   unset(nlohmann_json_DIR CACHE)
 endif()
+
+cmake_dependent_option(ARB_USE_BUNDLED_RANDOM123 "Use bundled Random123 lib." ON "ARB_USE_BUNDLED_LIBS" OFF)
+add_library(ext-random123 INTERFACE)
+if(NOT ARB_USE_BUNDLED_RANDOM123)
+    find_package(Random123 REQUIRED)
+    target_include_directories(ext-random123 INTERFACE ${RANDOM123_INCLUDE_DIR})
+endif()
+
 add_subdirectory(ext)
 
-cmake_dependent_option(ARB_USE_BUNDLED_FMT "Use bundled FMT lib." ON "ARB_USE_BUNDLED_LIBS" OFF)
+install(TARGETS ext-random123 EXPORT arbor-targets)
 
 # Keep track of packages we need to add to the generated CMake config
 # file for arbor.
diff --git a/cmake/FindRandom123.cmake b/cmake/FindRandom123.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..5ca93e6c03b082b24d687870ea98d71886054b3c
--- /dev/null
+++ b/cmake/FindRandom123.cmake
@@ -0,0 +1,23 @@
+
+# CMake find_package() Module for Random123 header-only C++ library
+# https://github.com/DEShawResearch/random123
+#
+# Example usage:
+#
+# find_package(Random123)
+#
+# If successful the following variables will be defined
+# RANDOM123_FOUND
+# RANDOM123_INCLUDE_DIR
+
+find_path(RANDOM123_INCLUDE_DIR Random123/threefry.h)
+
+if(RANDOM123_INCLUDE_DIR)
+    set(RANDOM123_FOUND TRUE)
+    message(STATUS "Found Random123: ${RANDOM123_INCLUDE_DIR}")
+endif()
+
+if(RANDOM123_FIND_REQUIRED AND NOT RANDOM123_FOUND)
+    message(FATAL_ERROR "Required package Random123 not found")
+endif()
+
diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt
index 5c89d3d245681fc1e37fef8688b4849f57063ee7..ade8698f2fbc895b24acd52e6098e64e161d11dc 100644
--- a/ext/CMakeLists.txt
+++ b/ext/CMakeLists.txt
@@ -6,17 +6,22 @@ if(ARB_USE_BUNDLED_JSON)
   set(json_library_name ext-json PARENT_SCOPE)
 endif()
 
+# Random123 (DE Shaw Research) counter-based random number generators (header-only)
+
+if(ARB_USE_BUNDLED_RANDOM123)
+    check_git_submodule(random123 random123)
+    if(NOT random123_avail)
+        message(FATAL_ERROR "Required Random123 submodule is not available.")
+    endif()
+    target_include_directories(ext-random123 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/random123/include)
+    message(STATUS "Using Random123 submodule: ${CMAKE_CURRENT_SOURCE_DIR}>/random123")
+endif()
+
 # tinyopt command line parsing libary (header-only).
 
 add_library(ext-tinyopt INTERFACE)
 target_include_directories(ext-tinyopt INTERFACE tinyopt/include)
 
-# Random123 (DE Shaw Research) counter-based random number generators (header-only)
-
-add_library(ext-random123 INTERFACE)
-target_include_directories(ext-random123 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/random123/include)
-install(TARGETS ext-random123 EXPORT arbor-targets)
-
 # Google benchmark for microbenchmarks:
 
 check_git_submodule(gbench google-benchmark)