【问题标题】:Random Number Generator is always generating the same numbers随机数生成器总是生成相同的数字
【发布时间】:2016-04-12 07:11:22
【问题描述】:

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

#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

我做错了什么以及如何在我的数组中获取随机数?

【问题讨论】:

  • 您可能希望包含您正在使用的编译器和版本以及您所在的平台。您的代码在 VS2013 中适用于我。
  • 它也适用于 GCC 和 ArchLinux ...
  • 你需要声明 srand(time(NULL))
  • @JarrodRoberson,那篇文章是关于 srand 的,但这篇文章是关于 random_device 的。后者应该产生更好的随机性。

标签: c++ random


【解决方案1】:

std::random_device 上调用entropy() member function 以了解您的实现是否正确实施:

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

(Source)

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

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

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

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

【讨论】:

    【解决方案2】:

    如果随机硬件设备不可用于实现,则使用伪随机数引擎。是否有可用的随机数硬件设备?我的意思是不仅在物理上存在,而且对 std::random_device 的特定实现也可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多