Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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中的二维随机对称行走, #包括 #包括 #包括 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

我的代码生成二维随机对称行走。 它生成一个介于0和3之间的随机整数,并在此基础上向上、向下、向左或向右移动。有一个数学定理,可以保证行走以有限步结束(达到(0,0))


代码可以工作,但当我按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));