< cpp‎ | numeric‎ | random‎ | random device
Pseudo-random number generation
Uniform random bit generators
Engines and engine adaptors
Non-deterministic generator
Uniform distributions
Bernoulli distributions
Poisson distributions
Normal distributions
Sampling distributions
Seed Sequences
C library
Member functions
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)
1) Default constructs a new std::random_device object with an implementation-defined token.
2) Constructs a new std::random_device object, making use of the argument token in an implementation-defined manner.
3) The copy constructor is deleted: std::random_device is not copyable nor movable.


[edit] Exceptions

Throws an implementation-defined exceptions derived from std::exception on failure.

[edit] Notes

The implementation in libstdc++ expects token to name the source of random bytes. Possible token values include "default", "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.

[edit] Example

Demonstrates the two commonly available types of std::random_device on Linux

#include <iostream>
#include <random>
int main()
    std::uniform_int_distribution<int> d(0, 10);
    std::random_device rd1; // uses RDRND or /dev/urandom
    for(int n = 0; n < 10; ++n)
        std::cout << d(rd1) << ' ';
    std::cout << '\n';
    std::random_device rd2("/dev/random"); // much slower on Linux
    for(int n = 0; n < 10; ++n)
        std::cout << d(rd2) << ' ';
    std::cout << '\n';

Possible output:

7 10 7 0 4 4 6 9 4 7 
2 4 10 6 3 2 0 6 3 7

[edit] Defect reports

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