问题描述
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(){
srand((unsigned)time(NULL));
int t=0;
int s=0;
int i;
for(i=0;1;i++){
printf("%d. (%d,%d)\n",i,t,s);
if(t== 0 && s==0){
system("pause");
printf("\n");
i=0;
}
int k= rand()%4;
if(k==0)t--;
else if(k==1)t++;
else if(k==2)s--;
else s++;
}
}
我的代码生成二维的随机对称行走。 它会生成一个介于0到3之间的随机整数,并以此为基础向上,向下,向左或向右移动。有一个数学定理,可以保证步行以有限的步长结束(到达(0,0))。
该代码有效,但是当我按Enter键足够多的时间时,我注意到对称行走重复。例如,首先我生成长度为206785的游走,然后在5-6次漫游后,我再次生成为长度206785游走。我猜这是srand()函数的问题,但有人可以弄清楚问题出在哪里。>
编辑:哦,是的,我正在代码块上尝试这个。
解决方法
问题是您的C库实现 rand 使用的Pseudorandom Number Generator的周期性小。所有PRNG都具有周期性,即序列必须重复。使用具有较大周期性的伪随机数生成器。我可以为您搜寻,但不想破坏乐趣:-)
,rand()函数生成32768个不同的伪随机值,如果您调用它足够多次,该序列将重复。假设循环需要1毫秒以上的时间,您可以通过在for循环中添加类似的内容来获得更多(表面)随机性。
srand(rand() ^ (unsigned)time(NULL));
一个更好的选择是用一些更高级的随机数库(例如boost::random
替换rand()) ,多次调用代码同一秒(例如time()
具有相同的值)会导致相同的输出。
为了代替初始化,代码需要代替srand((unsigned)time(NULL))
来包含其他区分数据。也许是一个进程ID(从文件中算出),是微秒的壁挂时间。