srand(time(NULL)),我不理解种子的含义,能说下吗
求100以内5个不同的随机数。。正确的代码是下面的:
int main()
{
srand(time(NULL));
for(int i=0; i <5; i++)
{
cout < < rand()%100 < < endl;}
}
我认为srand(time(NULL))是不是应该放到循环里面?时间每次都是不一样的,每次循环的时候应该都在执行一下srand(time(NULL))呢。
[解决办法]
每次程序运行的时候都会自动为随机数产生相同的种子,srand是将种子变成更加具有随机性的值。
在你的程序中,假设说:srand产生了相同的值,那么,每次运行程序生成的随机数序列,是相同的。
也就是说,srand影响了之后产生随机数的整个序列。
如果将srand放在循环内部,可以保证程序产生的随机数序列中的每个数字都具有更高的随机性(假设在一个time单位中循环只运行一次statement)。
如果将srand放在循环外部,则生成的序列是有规律可循的,虽然这个规律并不那么明了。但是可以获得更高的效率,和一组可应用与所有非极度敏感的应用的随机数。
即使将srand放在循环内部,产生的随机数序列仍然具有一定的模式,但是它具有更加模糊的规律。
[解决办法]
程序执行的速度是很快的,
在循环内部死 srand 其实是在使用同一个种子。
【注意time的精度】
[解决办法]
可以这样:
for(int i=0; i <5; i++)
{
sleep(10); //这样延迟时间,可以达到srand设置不同种子的目的
srand(time(NULL));
cout < < rand()%100 < < endl;
}
当然,完全没有必要这样,只是解释个原理....
[解决办法]
种子只要一个即可,这样程序在一次执行过程中产生的数可以看作随机数
如果每次都重新设置种子,由于种子都一样,产生的数也会一样,就没有随机性可言了
而用时间做种子,由于时间的唯一性,能保证程序做【两次执行】中的随机数序列不相同