1

我有一个 C 程序,它使用 0-999 的随机数创建一个 1000 个整数的数组,然后对该数组执行某种算法。为了测试算法的运行时间,我尝试运行程序 10000 次,但每次运行它的数组对于几个数组都是相同的,然后它会改变。我已经使用该srand()功能以当前时间喂种子,但它仍然没有帮助。

是否有替代解决方案rand()或解决此问题的方法?我的功能是:

void getarray(int *ptr1, int size, int option){
    int n;
    srand(time(NULL));
    for(n=0; n<size; n++)
        *(ptr1+n) = *(ptr2+n)= rand()%1000; 
}

提前致谢!

4

4 回答 4

10

您应该只调用 srand 一次:在程序启动时。

现在,如果您在更改之前多次调用您的函数,time您的顺序将是相同的。

于 2013-05-18T11:44:01.463 回答
5

lrand48() 调用往往在内部有更多的状态和更好的伪随机数分布。

但是,请注意,您仅以 1 秒的粒度重新播种,因此同一秒内的调用将生成相同的序列。将您的srand()电话main()拨入或某处,一次,而不是在getarray.

于 2013-05-18T11:44:33.700 回答
4

您应该非常仔细地调查是否对这项工作rand()更好的功能。

它因编译器和平台而异,但通常被实现为“线性同余生成器”,在速度和内存使用方面非常方便,但统计特性较差(即,您可以判断同余随机生成的序列是否足够长生成器,或者如果它真的是随机的)。

rand()在您的用例(测试算法的速度)中,只要执行不受数据统计属性的影响,就可以很好地使用。如果rand()是一个线性同余 RNG,则数列显示出一种模式,这意味着在任何给定时间,并非所有数都是等概率的。这张维基百科图片中有一个很好的例子:

LC NRG

您的系统可能还有一个 RNG(例如 /dev/random)及其相关函数,但请注意,这些函数旨在产生少量高质量的随机数,并且使用起来可能非常缓慢。您甚至可能用完数字并最终等待系统收集更多熵!

ISAAC是一个简单、非常快速的 RNG,其统计特性足以胜任密码学。就我个人而言,每当我需要像样的随机数时,我都会使用它。

另一种选择是使用由RANDOM.orgHotBits生成的真正随机数,但在您的情况下它可能会过大。

作为旁注,RANDOM.ORG在 RNG 上有一个不错的页面,其中包含由 PHPrand()函数创建的另一个“模式”示例

于 2013-05-18T12:15:00.643 回答
1

首先,调用种子函数一次,而不是循环调用。

其次,我建议你:

1) 切换到 random(3) 函数 2) 从 rand48 / lrand48 中挑选一些东西 3) 自己读取 /dev/random 所需的字节数。

解决方案 1) 很简单,而且有点便携。2需要一点思考,3是最省事的,也是最不便携的。

于 2013-05-18T11:46:58.090 回答