随机数发生器每次重复?

时间:2016-04-03 09:55:09

标签: c++ random windows-7

我正在尝试找一个随机数生成器,每次运行它时都会给我一个随机数。我花了一个星期的时间尝试了几十个不同的网站,包括这个网站和其他网站。每次我运行它,它给我相同的数字!它改变的唯一时间是我改变范围,然后它只是一遍又一遍地给我新的数字。 我正在运行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';
}

我也在手机上的编译器应用程序上尝试了代码。

2 个答案:

答案 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以伪随机数生成器的形式实现。

您可能需要找到不同的熵源,例如时间或用户触摸坐标。