随机数生成器始终生成相同的数字

时间:2016-04-12 07:11:22

标签: c++ random

我正在尝试使用以下代码填充我的数组随机数

#include<iostream>
#include<random>

int main(){
int n = 5;
int list[10];
std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<> distr(0, 1000);

for(int i=0;i<n;i++)
    list[i] = distr(eng);

std::cout<<"The list of elements is: ";
for(int i=0;i<n;i++)
    std::cout<<list[i]<<" ";
}

对于n = 5,我总是得到相同的输出

562 726 348 916 6

对于n = 6,我总是得到相同的输出

562 726 348 916 6 594

这些数字不是随机的,我也检查了熵

std:cout<<rd.entropy();

这给了我输出

0

我做错了什么,如何在我的数组中获得随机数?

3 个答案:

答案 0 :(得分:1)

如果随机硬件设备不可用于实现,则使用伪随机数引擎。是随机数硬件设备吗?通过这种方式,我的意思不仅仅是物理存在,而且还可用于std :: random_device的特定实现。

答案 1 :(得分:1)

致电std::random_device上的entropy() member function,了解您的实施是否正确实施:

  

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

Source

如果是这种情况,请call to entropy() will return 0

  

确定性随机数发生器(例如伪随机引擎)   熵为零。

如果是这种情况,则需要使用不同的回退机制进行种子设定。例如,您可以使用基于时间的种子,就像在旧的C-days中一样。

特别是在桌面平台上,您应该期望将std::random_device实现为适当的非确定性来源。如果不是这种情况,您可能只是使用标准库实现的旧版本。如果您认为实现应该支持非确定性std::random_device但不支持,请考虑使用标准库维护者提交错误报告。

答案 2 :(得分:-1)

我认为你需要做的就是改变种子。

通常使用时间(因为它不是常数值):

std::default_random_engine generator( (unsigned int)time(0) );

参见this post  了解更多信息