std:: random_device
|
Определено в заголовке
<random>
|
||
|
class
random_device
;
|
(начиная с C++11) | |
std::random_device
- это генератор равномерно распределенных целочисленных случайных чисел, который производит недетерминированные случайные числа.
std::random_device
может быть реализован на основе определенной реализацией псевдослучайной генераторной системы, если в данной реализации недоступен недетерминированный источник (например, аппаратное устройство). В этом случае каждый объект
std::random_device
может генерировать одинаковую последовательность чисел.
Содержание |
Типы членов
| Тип члена | Определение |
result_type
(C++11)
|
unsigned int |
Функции-члены
Конструкция |
|
|
конструирует механизм
(public member function) |
|
|
operator=
(deleted)
(C++11)
|
оператор присваивания удалён
(public member function) |
Генерация |
|
|
продвигает состояние механизма и возвращает сгенерированное значение
(public member function) |
|
Характеристики |
|
|
(C++11)
|
получает оценку энтропии для недетерминированного генератора случайных чисел
(public member function) |
|
[static]
|
получает наименьшее возможное значение в выходном диапазоне
(public static member function) |
|
[static]
|
получает наибольшее возможное значение в выходном диапазоне
(public static member function) |
Примечания
Примечательная реализация, где
std::random_device
является детерминированной в старых версиях MinGW-w64 (
баг 338
, исправлено начиная с GCC 9.2). Последние версии MinGW-w64 можно загрузить с
GCC с моделью потоков MCF
.
Пример
#include <iostream> #include <map> #include <random> #include <string> int main() { std::random_device rd; std::map<int, int> hist; std::uniform_int_distribution<int> dist(0, 9); for (int n = 0; n != 20000; ++n) ++hist[dist(rd)]; // примечание: только для демонстрации: производительность многих // реализаций random_device резко снижается // после исчерпания энтропийного пула. На практике // random_device обычно используется только для инициализации // ГПСЧ, такого как mt19937 for (auto [x, y] : hist) std::cout << x << " : " << std::string(y / 100, '*') << '\n'; }
Возможный вывод:
0 : ******************** 1 : ******************* 2 : ******************** 3 : ******************** 4 : ******************** 5 : ******************* 6 : ******************** 7 : ******************** 8 : ******************* 9 : ********************