c中的二维随机对称行走, #包括 #包括 #包括 int main(){ srand((无符号)时间(NULL)); int t=0; int s=0; int i; 对于(i=0;1;i++){ printf(“%d.(%d,%d)\n”,i,t,s); 如果(t==0&&s==0){ 系统(“暂停”); printf(“\n”); i=0; } int k=rand()%4; 如果(k==0)t--; 如果(k==1)t++,则为else; 如果(k==2)s--; s++; } }
我的代码生成二维随机对称行走。 它生成一个介于0和3之间的随机整数,并在此基础上向上、向下、向左或向右移动。有一个数学定理,可以保证行走以有限步结束(达到(0,0))c中的二维随机对称行走, #包括 #包括 #包括 int main(){ srand((无符号)时间(NULL)); int t=0; int s=0; int i; 对于(i=0;1;i++){ printf(“%d.(%d,%d)\n”,i,t,s); 如果(t==0&&s==0){ 系统(“暂停”); printf(“\n”); i=0; } int k=rand()%4; 如果(k==0)t--; 如果(k==1)t++,则为else; 如果(k==2)s--; s++; } },c,srand,C,Srand,我的代码生成二维随机对称行走。 它生成一个介于0和3之间的随机整数,并在此基础上向上、向下、向左或向右移动。有一个数学定理,可以保证行走以有限步结束(达到(0,0)) 代码可以工作,但当我按enter键足够多次时,我注意到对称行走会重复。例如,首先生成长度为206785的行走,然后在5-6次行走之后,再次生成长度为206785的行走。我想这就是srand()函数的问题所在,但是有人能澄清问题所在吗 编辑:哦,是的,我在代码块上试着这样做。问题是C库实现rand使用的代码的周期性很小。所有PRNG
代码可以工作,但当我按enter键足够多次时,我注意到对称行走会重复。例如,首先生成长度为206785的行走,然后在5-6次行走之后,再次生成长度为206785的行走。我想这就是srand()函数的问题所在,但是有人能澄清问题所在吗
编辑:哦,是的,我在代码块上试着这样做。问题是C库实现rand使用的代码的周期性很小。所有PRNG都具有周期性,即序列根据需要重复。使用周期性较大的伪随机数生成器。我可以为您搜索一个,但不想破坏乐趣:-)rand()函数生成32768个不同的伪随机值,如果调用次数足够多,序列将重复。假设循环运行时间超过1毫秒,通过在for循环中添加类似的内容,可以实现更多(明显的)随机性
#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++;
}
}
更好的替代方法是用更高级的随机数库替换rand(),例如在同一秒内多次调用代码(例如,
time()
具有相同的值),结果相同
代码需要包括初始化的其他差异数据,而不是
srand((无符号)时间(NULL))
。可能是一个进程ID,从一个文件中计算,微秒墙时间。boost::random在C程序中?当然你是在开玩笑。好吧,对不起,但我相信你可以找到其他的东西。“32768个不同的伪随机值,如果你调用它足够多次,序列将重复。”-->“不同的伪随机值”的数量与生成器的序列长度无关。rand()函数生成32768个不同的伪随机值
no,rand()
生成rand_MAX+1
不同的伪随机值,rand_MAX
的值取决于实现“当我按enter键的次数足够多时,”-->您是说在同一秒内运行程序多次吗?
srand(rand() ^ (unsigned)time(NULL));