random_device() : random_device( /*implementation-defined*/ ) {} | (1) | (since C++11) |
explicit random_device( const std::string& token ); | (2) | (since C++11) |
random_device( const random_device& ) = delete; | (3) | (since C++11) |
std::random_device
object, making use of the argument token
in an implementation-defined manner. std::random_device
is not copyable nor movable.Throws an implementation-defined exception derived from std::exception
on failure.
The implementation in libstdc++ expects token
to name the source of random bytes. Possible token values include "default"
, "hw"
, "rand_s"
, "rdseed"
, "rdrand"
, "rdrnd"
, "/dev/urandom"
, "/dev/random"
, "mt19937"
, and integer string specifying the seed of the mt19937 engine. (Token values other than "default"
are only valid for certain targets.).
The implementation in libc++, when configured to use character device as the source, expects token
to be the name of a character device that produces random numbers when read from; otherwise it expects token
to be "/dev/urandom"
.
Both libstdc++ and libc++ throw an exception if provided an unsupported token. Microsoft's stdlib ignores the token entirely.
Demonstrates commonly available types of std::random_device
on Linux.
#include <iostream> #include <random> void demo(std::random_device&& rd) { static std::uniform_int_distribution<int> d(0, 9); for (int n = 0; n != 10; ++n) std::cout << d(rd) << ' '; std::cout << '\n'; } int main() { // Note: How the supplied token is handled is implementation-defined! // Default token for random_device is usually /dev/urandom on Linux demo(std::random_device {}); // Request /dev/random, blocks when entropy is empty // Works on libstdc++, ignored in msvc++, might throw on libc++ (as of Nov 2022) demo(std::random_device {"/dev/random"}); // Request non-blocking /dev/urandom, ensures that RDRAND is not used // Works on libstdc++ and libc++, ignored in msvc++ (as of Nov 2022) demo(std::random_device {"/dev/urandom"}); // Request "hw", will use hardware-based random generation like rdrand // Works on libstdc++, ignored in msvc++, throws on libc++ (as of Nov 2022) demo(std::random_device {"hw"}); }
Possible output:
9 5 2 7 5 9 4 1 0 7 4 7 6 5 1 5 5 1 8 6 3 3 6 1 4 1 4 1 0 2 4 6 3 9 1 9 4 0 9 3
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P0935R0 | C++11 | default constructor was explicit | made implicit |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/random/random_device/random_device