我正在尝试找一个随机数生成器,每次运行它时都会给我一个随机数。我花了一个星期的时间尝试了几十个不同的网站,包括这个网站和其他网站。每次我运行它,它给我相同的数字!它改变的唯一时间是我改变范围,然后它只是一遍又一遍地给我新的数字。 我正在运行Code :: Blocks ver。在Windows 7上16.01。有人可以帮忙吗?我的智慧结束了!
这段代码给了我一个体面的ramdom数字字符串,但每次都是相同的字符串!
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 eng(rd()); std::uniform_int_distribution<> distr(0, 10);
for(int n=0; n<100; ++n)
std::cout << distr(eng) << '\t';
}
我也在手机上的编译器应用程序上尝试了代码。
答案 0 :(得分:2)
每个伪随机数生成器将为相同的初始种子值返回相同的数字序列。 你想要做的是每次运行程序时使用不同的种子。否则,您每次只使用相同的默认种子并获得相同的值。
挑选好种子并不像你想象的那么容易。例如,如果程序的两个副本在同一秒内运行,则使用time(nullptr)
的输出仍然会得到相同的结果。使用getpid()
的值也很糟糕,因为pid值会换行,因此有时您会为不同的运行获得相同的值。幸运的是你有其他选择。 std::seed_seq
允许您组合多个不良来源并返回您可以使用的良好(或更确切地说,非常好)的种子值。还有std::random_device
(在所有理智的实现中)返回原始熵 - 非常适合播种伪随机生成器(或者如果它足够快以便您可以直接使用它),或者您可以将它与{如果你担心它可能被实现为你的实现的一个prng,那么{1}}和种子生成器的坏源。
我建议您阅读本页:http://en.cppreference.com/w/cpp/numeric/random,了解如何处理现代C ++中的随机数生成。
答案 1 :(得分:0)
如果系统上没有真正的随机源,则该标准允许std::random_device
以伪随机数生成器的形式实现。
您可能需要找到不同的熵源,例如时间或用户触摸坐标。