在c+中生成随机数+; 我在C++中得到一个生成数万个随机数的任务。我在C++中查询了很多随机数,查阅了C++的参考文献,但现在我感到困惑。

在c+中生成随机数+; 我在C++中得到一个生成数万个随机数的任务。我在C++中查询了很多随机数,查阅了C++的参考文献,但现在我感到困惑。,c++,random,random-seed,C++,Random,Random Seed,正如我所知,random_设备是一个非确定性随机数生成器,但每次我重新运行我的程序时,random_设备生成的随机数都是相同的。那么,当我重新启动我的程序时,如何为随机_设备设置一个种子,使随机数不同呢 我读到过“std::random_设备如果你试图从中获取大量数据,它可能会耗尽熵。这可能会导致它阻塞,直到你移动鼠标或其他东西”。这意味着我的程序可能会在某个时候暂停。如何避免这种情况发生?从中,您可以看到std::random\u设备并不总是保证不确定性: std::random_设备可以根据

正如我所知,random_设备是一个非确定性随机数生成器,但每次我重新运行我的程序时,random_设备生成的随机数都是相同的。那么,当我重新启动我的程序时,如何为随机_设备设置一个种子,使随机数不同呢

我读到过“std::random_设备如果你试图从中获取大量数据,它可能会耗尽熵。这可能会导致它阻塞,直到你移动鼠标或其他东西”。这意味着我的程序可能会在某个时候暂停。如何避免这种情况发生?

从中,您可以看到
std::random\u设备
并不总是保证不确定性:

std::random_设备可以根据实现定义的伪随机数引擎来实现,前提是非确定性源(例如硬件设备)对实现不可用。在这种情况下,每个std::random_设备对象都可以生成相同的数字序列

在Linux上,它默认使用
/dev/uradom
RDRND
CPU指令,具体如下:

libc++和libstdc++中的实现期望令牌是字符设备的名称,从中读取时会产生随机数,具有默认值“/dev/uradom”,尽管在CPU指令RDRND可用的情况下,libstdc++将其用作默认值

哪个不会阻止。您可以使用这种方法切换到一个甚至安全的设备
/dev/random
,但如果没有足够的熵,该设备将被阻塞

在Windows上,我不确定这样的设备,因此它可能会退回到一些需要某种种子的PRNG

如@Binara所述,为了跨平台解决问题,您可以使用
中的
std::rand
。这个函数不会阻塞,您可以使用
std::srand(像currenttime这样的东西)
使它成为一些不确定的东西


> @ USE1118321,如果你想使用一个更安全的PRNG,你可以考虑<代码> STD::MelsNeNyTwitsTyxEngult,并使用<代码> STD::RealthyDebug < /Cord>来生成它的种子。建议使用这种方法。

假设您不需要加密安全的随机数生成,那么您可以使用
std::mt19937
随机生成器。随机生成器在重复之前有219937次迭代。我过去曾这样使用过:

std::array<int, std::mt19937::state_size> seedData;
std::random_device  randDevice;
std::mt19937 eng;
std::uniform_real_distribution<double> randGen(0, 1);
std::generate_n(seedData.data(), seedData.size(), std::ref(randDevice));
std::seed_seq seq(std::begin(seedData), std::end(seedData));
eng.seed(seq);

你在用什么编译器
std::random_device
MinGW
中被破坏。我正在ubuntu下使用GNU或g++。你能发布一些复制问题的简短示例代码吗?我想这个答案可能会回答你的一些问题:为什么每次程序运行都需要不同的设置?
double randVal = randGen(eng);