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

Cha*_*ame 1 c++ random

所有

我带着一个简单的问题来.请先阅读以下代码

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;
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述 从这张图片中,我发现这两个随机序列在改变数量方面有类似的趋势.例如,这两个系列从(x = 57)到(x = 60),从(x = 82)到(x = 86)等一起上下移动.

我是否可以通过可视化简单地误导,或者确实存在某种相关性?

提前谢谢了.

最好的祝愿

Dav*_*men 5

你做了很多错事.

你做错的第一件事是使用rand().那里有很多优秀的优秀随机数发生器.rand()通常甚至不属于"好"类别.

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

double d1 = rand() % 100;
d1 = d1/double(100);
Run Code Online (Sandbox Code Playgroud)

这会丢弃结果中的高电平位rand().即使是好的随机数发生器也可能存在低位的问题.糟糕的随机数生成器,例如典型的实现rand()几乎可以保证这种情况.而是除以最大可能的结果rand(),RAND_MAX(转换成双倍).

接下来你做错了就是使用相同的伪随机序列来生成两个假设不相关的随机数序列.使用两个不同的生成器来做这件事要好得多.你根本无法做到这一点rand().使用更好的PRNG.

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