diff --git a/core/random.cpp b/core/random.cpp
deleted file mode 100644
index e37e472..0000000
--- a/core/random.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2019,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "random.hpp"
-#include <boost/thread/tss.hpp>
-
-namespace nfd {
-
-std::mt19937&
-getGlobalRng()
-{
-  static boost::thread_specific_ptr<std::mt19937> rng;
-  if (rng.get() == nullptr) {
-    std::random_device rd;
-    // seed with 256 bits of entropy
-    std::seed_seq seeds{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()};
-    rng.reset(new std::mt19937(seeds));
-  }
-  return *rng;
-}
-
-} // namespace nfd
diff --git a/core/random.hpp b/core/random.hpp
deleted file mode 100644
index 27e1067..0000000
--- a/core/random.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2017,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * \file
- * \brief Declares the global pseudorandom number generator (PRNG) for NFD
- *
- * All random numbers generated by NFD should use this global generator,
- * so that it can be properly seeded when necessary.
- *
- * \warning This PRNG is not suitable for security purposes; security-critical
- *          code must use a cryptographically secure PRNG, such as that provided
- *          by OpenSSL.
- */
-
-#ifndef NFD_CORE_RANDOM_HPP
-#define NFD_CORE_RANDOM_HPP
-
-#include <random>
-
-namespace nfd {
-
-/** \return the global random number generator instance
- */
-std::mt19937&
-getGlobalRng();
-
-} // namespace nfd
-
-#endif // NFD_CORE_RANDOM_HPP
diff --git a/daemon/fw/asf-probing-module.cpp b/daemon/fw/asf-probing-module.cpp
index 63f9867..8a81a77 100644
--- a/daemon/fw/asf-probing-module.cpp
+++ b/daemon/fw/asf-probing-module.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2018,  Regents of the University of California,
+ * Copyright (c) 2014-2019,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -24,9 +24,10 @@
  */
 
 #include "asf-probing-module.hpp"
-#include "core/random.hpp"
 #include "algorithm.hpp"
 
+#include <ndn-cxx/util/random.hpp>
+
 namespace nfd {
 namespace fw {
 namespace asf {
@@ -186,7 +187,7 @@
 ProbingModule::getRandomNumber(double start, double end)
 {
   std::uniform_real_distribution<double> dist(start, end);
-  return dist(getGlobalRng());
+  return dist(ndn::random::getRandomNumberEngine());
 }
 
 void
diff --git a/daemon/fw/ncc-strategy.cpp b/daemon/fw/ncc-strategy.cpp
index bb96009..df9a41b 100644
--- a/daemon/fw/ncc-strategy.cpp
+++ b/daemon/fw/ncc-strategy.cpp
@@ -25,7 +25,8 @@
 
 #include "ncc-strategy.hpp"
 #include "algorithm.hpp"
-#include "core/random.hpp"
+
+#include <ndn-cxx/util/random.hpp>
 
 namespace nfd {
 namespace fw {
@@ -176,7 +177,7 @@
 
   if (isForwarded) {
     std::uniform_int_distribution<time::nanoseconds::rep> dist(0, pitEntryInfo->maxInterval.count() - 1);
-    time::nanoseconds deferNext = time::nanoseconds(dist(getGlobalRng()));
+    time::nanoseconds deferNext(dist(ndn::random::getRandomNumberEngine()));
     pitEntryInfo->propagateTimer = scheduler::schedule(deferNext,
       bind(&NccStrategy::doPropagate, this, inFaceId, weak_ptr<pit::Entry>(pitEntry)));
   }
diff --git a/daemon/fw/strategy.cpp b/daemon/fw/strategy.cpp
index 4dfe32e..3f364ea 100644
--- a/daemon/fw/strategy.cpp
+++ b/daemon/fw/strategy.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2018,  Regents of the University of California,
+ * Copyright (c) 2014-2019,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -26,7 +26,6 @@
 #include "strategy.hpp"
 #include "forwarder.hpp"
 #include "core/logger.hpp"
-#include "core/random.hpp"
 
 #include <boost/range/adaptor/map.hpp>
 #include <boost/range/algorithm/copy.hpp>
diff --git a/rib/readvertise/readvertise.cpp b/rib/readvertise/readvertise.cpp
index 4c51a03..454ab20 100644
--- a/rib/readvertise/readvertise.cpp
+++ b/rib/readvertise/readvertise.cpp
@@ -25,7 +25,8 @@
 
 #include "readvertise.hpp"
 #include "core/logger.hpp"
-#include "core/random.hpp"
+
+#include <ndn-cxx/util/random.hpp>
 
 namespace nfd {
 namespace rib {
@@ -38,8 +39,8 @@
 static time::milliseconds
 randomizeTimer(time::milliseconds baseTimer)
 {
-  std::uniform_int_distribution<uint64_t> dist(-5, 5);
-  time::milliseconds newTime = baseTimer + time::milliseconds(dist(getGlobalRng()));
+  std::uniform_int_distribution<> dist(-5, 5);
+  auto newTime = baseTimer + time::milliseconds(dist(ndn::random::getRandomNumberEngine()));
   return std::max(newTime, 0_ms);
 }
 
diff --git a/tests/core/random.t.cpp b/tests/core/random.t.cpp
deleted file mode 100644
index dcd1576..0000000
--- a/tests/core/random.t.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2016,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "core/random.hpp"
-
-#include "tests/test-common.hpp"
-
-#include <boost/thread.hpp>
-
-namespace nfd {
-namespace tests {
-
-BOOST_AUTO_TEST_SUITE(TestRandom)
-
-BOOST_AUTO_TEST_CASE(ThreadLocalRng)
-{
-  std::mt19937* s1 = &getGlobalRng();
-  std::mt19937* s2 = nullptr;
-  boost::thread t([&s2] {
-    s2 = &getGlobalRng();
-  });
-
-  t.join();
-
-  BOOST_CHECK(s1 != nullptr);
-  BOOST_CHECK(s2 != nullptr);
-  BOOST_CHECK(s1 != s2);
-}
-
-BOOST_AUTO_TEST_SUITE_END() // TestRandom
-
-} // namespace tests
-} // namespace nfd
diff --git a/tests/daemon/mgmt/face-manager.t.cpp b/tests/daemon/mgmt/face-manager.t.cpp
index 69b2116..cebbfd4 100644
--- a/tests/daemon/mgmt/face-manager.t.cpp
+++ b/tests/daemon/mgmt/face-manager.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2018,  Regents of the University of California,
+ * Copyright (c) 2014-2019,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -24,7 +24,6 @@
  */
 
 #include "mgmt/face-manager.hpp"
-#include "core/random.hpp"
 #include "face/protocol-factory.hpp"
 
 #include "nfd-manager-common-fixture.hpp"
@@ -38,6 +37,7 @@
 #include <ndn-cxx/mgmt/nfd/face-query-filter.hpp>
 #include <ndn-cxx/mgmt/nfd/face-status.hpp>
 #include <ndn-cxx/net/network-monitor-stub.hpp>
+#include <ndn-cxx/util/random.hpp>
 
 namespace nfd {
 namespace tests {
@@ -109,7 +109,7 @@
   randomizeCounter(const T& counter)
   {
     static std::uniform_int_distribution<typename T::rep> dist;
-    const_cast<T&>(counter).set(dist(getGlobalRng()));
+    const_cast<T&>(counter).set(dist(ndn::random::getRandomNumberEngine()));
   }
 
 protected:
