gpt4 book ai didi

c++ - 为什么 C++ std::rand() 有模式?

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:25 25 4
gpt4 key购买 nike

全部

我要问一个简单的问题。请先阅读我的以下代码

int main()
{
vector<double> arr1, arrr2;
arr1.resize(120);
arr2.resize(120);
for(int i = 0; i < 120; i++)
{
double d1 = rand() % 100;
d1 = d1/double(100);
arr1[i] =d1;

double d2 = rand() % 100;
d2 = d2/double(100);
arr2[i] =d2;

}
return 0;
}

在上面的代码中,我生成了两个随机数组(没有任何种子)。我将这些数组保存在文件中并将它们绘制如下:

enter image description here从这张图中,我发现这两个随机序列在数字变化上有相似的趋势。例如这两个系列一起从 (x=57) 到 (x=60),从 (x=82) 到 (x=86),等等。

我是否可以知道我只是被可视化误导了,还是确实存在某种相关性?

非常感谢。

祝福

最佳答案

你做错了很多事。

您做错的第一件事是使用 rand()。那里有很多优秀的随机数生成器。 rand() 通常甚至不属于“好”类别。

接下来你做错的是将整数结果从 rand() 转换为 double via

double d1 = rand() % 100;
d1 = d1/double(100);

这会丢弃 rand() 结果中的高位。即使是好的随机数生成器也可能在低阶位方面出现问题。糟糕的随机数生成器(例如 rand() 的典型实现)几乎可以保证是这种情况。而是除以 rand() 的最大可能结果,RAND_MAX(转换为 double )。

接下来您做错的是使用相同的伪随机序列生成两个假定不相关的随机数序列。最好使用两个不同的生成器来执行此操作。您根本无法使用 rand() 来做到这一点。使用更好的 PRNG。

您做错的最后一件事是看到了一个可能不存在的模式。您需要使用比您的眼睛更强大的技术,例如统计相关性。或者只是使用更好的 PRNG,它已经过各种测试以确保结果满足各种“随机性”测试。

关于c++ - 为什么 C++ std::rand() 有模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18123394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com