std::random_device:: random_device
|
random_device
(
)
:
random_device
(
/*implementation-defined*/
)
{
}
|
(1) | (начиная с C++11) |
|
explicit
random_device
(
const
std::
string
&
token
)
;
|
(2) | (начиная с C++11) |
|
random_device
(
const
random_device
&
)
=
delete
;
|
(3) | (начиная с C++11) |
token
.
std::random_device
не поддерживает копирование или перемещение.
Содержание |
Исключения
Выбрасывает определяемую реализацией исключение, производное от std::exception при неудаче.
Примечания
Реализация в
libstdc++
ожидает, что
token
указывает на источник случайных байтов. Возможные значения token включают
"default"
,
"hw"
,
"rand_s"
,
"rdseed"
,
"rdrand"
,
"rdrnd"
,
"/dev/urandom"
,
"/dev/random"
,
"mt19937"
, и строку целого числа, указывающую сид для движка mt19937. (Значения token, отличные от
"default"
, допустимы только для определённых целевых платформ.)
Реализация в
libc++
, когда настроена на использование символьного устройства в качестве источника, ожидает, что
token
будет именем символьного устройства, которое генерирует случайные числа при чтении; в противном случае ожидается, что
token
будет
"/dev/urandom"
.
И libstdc++, и libc++ выбрасывают исключение, если передан неподдерживаемый токен. Стандартная библиотека Microsoft полностью игнорирует токен.
Пример
Демонстрирует общедоступные типы
std::random_device
в 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() { // Примечание: Обработка предоставленного токена зависит от реализации! // Токен по умолчанию для random_device обычно /dev/urandom в Linux demo(std::random_device {}); // Запрос /dev/random, блокируется при отсутствии энтропии // Работает в libstdc++, игнорируется в msvc++, может выбрасывать исключение в libc++ (по состоянию на ноябрь 2022) demo(std::random_device {"/dev/random"}); // Запрос неблокирующего /dev/urandom, гарантирует, что RDRAND не используется // Работает в libstdc++ и libc++, игнорируется в msvc++ (по состоянию на ноябрь 2022) demo(std::random_device {"/dev/urandom"}); // Запрос "hw", будет использовать аппаратную генерацию случайных чисел, такую как rdrand // Работает в libstdc++, игнорируется в msvc++, выбрасывает исключение в libc++ (по состоянию на ноябрь 2022) demo(std::random_device {"hw"}); }
Возможный вывод:
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
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P0935R0 | C++11 | default constructor was explicit | made implicit |
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| P0935R0 | C++11 | конструктор по умолчанию был explicit | сделан implicit |