1

全部

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

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;
}

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

在此处输入图像描述 从这张图片中,我发现这两个随机系列在改变数字方面具有相似的趋势。例如这两个系列从(x = 57)到(x = 60),从(x = 82)到(x = 86),等等。

我可以知道我是否只是被可视化误导了,还是真的存在一些相关性?

提前谢谢了。

最好的祝愿

4

3 回答 3

5

你做错了很多事情。

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

您做错的下一件事是将整数结果从转换rand()为 double via

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

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

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

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

于 2013-08-08T10:45:01.520 回答
2

您的代码会有一个小的偏差,因为 RAND_MAX 不能完全被 100 整除,并且除了 log2(100) 位精度之外,您会丢弃所有精度,但是您看到的相关性可能非常真实。标准 C rand() 的质量是出了名的低劣,因为它通常只是一个简单的线性同余生成器,而且几十年来人们都知道这些生成器对于任何严肃的使用都是不可接受的,但是库编写者很懒惰。

查找具有更好 PRNG 算法的库。这里的很多人可能会推荐像 Mersenne Twister 这样的东西,它很受欢迎,但不是最好的。现代生成器使用生成器函数的仔细组合,包括带进位的乘法、异或移位、滞后斐波那契(甚至 LCG),并且不相关算法的组合有助于消除相关性。

另请查看数字食谱的第 7 章。

于 2013-08-08T10:47:21.197 回答
1

我没有看到模式的证据。人脑是一台模式匹配机器,我们到处都能看到它们,随机性在我们看来是一种聚集的趋势,因此在两个随机流中,您可以期望找到具有看似匹配趋势的部分。

于 2013-08-08T10:46:35.067 回答