Namespaces
Variants

std::random_device:: random_device

From cppreference.net
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)
1) Создает новый объект std::random_device с конструктором по умолчанию, используя определенную реализацией token .
2) Создает новый объект std::random_device , используя аргумент token в реализации-определенной манере.
3) Конструктор копирования удален: 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