我有一个程序,在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;
}
提前致谢!
答案 0 :(得分:10)
你应该只调用srand一次:在程序启动时。
现在,如果您在time
更改之前多次调用您的函数,那么您的序列将是相同的。
答案 1 :(得分:4)
lrand48()调用往往在内部有更多的状态和更好的伪随机数分布。
但是,请注意,您仅以1秒的粒度重新播种,因此在同一秒内调用将生成相同的序列。将您的srand()
来电置于main()
或某处,而不是在getarray
中召回。
答案 2 :(得分:3)
如果rand()
是作业的更好功能,您应该非常仔细地进行调查。
它因编译器和平台而异,但它通常被定义为“Linear congruential generator”,它在速度和内存使用方面非常方便,但统计属性很差(即你可以判断一个足够长的序列是否有由同余随机生成器生成或者如果它是真正随机的)。
在您的用例(测试算法的速度)中使用rand()
可能完全没问题,只要执行不受数据统计属性的影响。如果rand()
是线性同余RNG,则数字序列显示模式,这意味着在任何给定时间,并非所有数字都是等概率的。这个维基百科图片就是一个很好的例子:
您的系统可能还有一个RNG(例如/ dev / random)及其相关功能,但请注意,这些功能只会产生很少的高质量随机数,并且可能使用起来很慢。你甚至可能会用尽数字并最终等待系统收集更多的诡计!
一个简单,非常快的RNG,其统计特性足以用于加密,ISAAC。就个人而言,只要我需要不错的随机数字,我就会使用它。
另一种方法是使用真正的随机数作为RANDOM.org或HotBits生成的随机数,但在您的情况下可能会有点过分。
作为旁注,RANDOM.ORG有一个很好的page on RNG,还有另一个由PHP rand()
函数创建的“模式”示例
答案 3 :(得分:0)
首先,调用种子函数一次,而不是循环。
其次,我建议你:
1)切换到random(3)功能 2)从rand48 / lrand48中选择一些东西 3)自己读取/ dev / random所需的字节数。
解决方案1)简单易用。 2需要一点思考,3是最有效的,也是最不便携的。