寻找严肃、沉默和专注的力量。
分类: C/C++
2013-05-31 17:08:22
iWonderLinux2013-05-31 17:13:53
srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子: rand = rand*const_1 + c_var;
srand函数就是给它的第一个rand值。用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不可取的, 比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0)) 产生一个0到n之间的随机数
RAND_MAX=0x7fffffff
iWonderLinux2013-05-31 17:11:06
更重要的一个原因:
作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序列必须是可重现的。 这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一
次测试的过程,从而更有效的找到问题的所在。 所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。
iWonderLinux2013-05-31 17:10:13
C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,我觉得至少有三个原因:
(1)可以高效产生连续的随机数,不用每次都初始化;
(2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟;
(3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。