--- /dev/null
+--- a/src/web/random_device.cpp
++++ b/src/web/random_device.cpp
+@@ -39,16 +39,6 @@
+ #endif
+
+ #ifdef USE_URANDOM
+-#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+-// A definition is required even for integral static constants
+-const bool boost::random_device::has_fixed_range;
+-const boost::random_device::result_type boost::random_device::min_value;
+-const boost::random_device::result_type boost::random_device::max_value;
+-#endif
+-
+-// the default is the unlimited capacity device, using some secure hash
+-// try "/dev/random" for blocking when the entropy pool has drained
+-const char * const boost::random_device::default_token = "/dev/urandom";
+
+ /*
+ * This uses the POSIX interface for unbuffered reading.
+@@ -119,7 +109,6 @@
+ #include <windows.h>
+ #include <wincrypt.h>
+ #include <stdexcept>
+-const char * const boost::random_device::default_token = "";
+
+ // Note about thread-safety: according to my reading of the MSDN page
+ // 'Threading Issues with Cryptographic Service Providers', both the
+@@ -156,6 +145,10 @@
+ };
+ #endif
+
++BOOST_RANDOM_DECL boost::random::random_device::random_device()
++ : pimpl(new impl("/dev/urandom"))
++{}
++
+ boost::random_device::random_device(const std::string& token)
+ : pimpl(new impl(token))
+ {