真的很奇怪,程序的调试工作正常,但是当我运行它时,我得到了一个奇怪的结果

时间:2013-11-15 16:29:36

标签: c

我正在尝试在C编程中创建一个“游戏”,为用户抛出2个骰子,为PC投掷2个骰子,并且获得更大金额的人获胜, 当我在visual studio中调试它时,我在变量值和控制台窗口中看到了良好的结果,但是当我在没有调试用户和PC的情况下运行它时,它们总是得到相同的骰子值(用户获得2和2,并且例如,PC获得2和2。

任何人都可以解决吗?我看了过去3个小时,我发现问题无法解决。

            #define _CRT_SECURE_NO_WARNINGS
            #include <stdlib.h>
            #include <stdio.h>
            #include <time.h>
            int throwDice();
            int diceSum();
            int main()
            {
                int res1;
                res1=diceSum();
                if(res1==0)
                    printf("It is a tie!\n");
                if(res1==1)
                    printf("You Won!\n");
                if(res1==-1)
                    printf("You Lost\n");
            }
            int throwDice()
            {
            int i;
            srand((unsigned)time(NULL));
            i = (rand()%(6-1)) + 1;
            return i;
            }
            int diceSum()
            {
                int j,a=0,b,c=0,d=0;
                int array[4];
                for(j=1;j<=2;j++)
                {
                    array[c]=throwDice();
                    a=a+array[c];
                    c++;
                }
                    for(b=1;b<=2;b++)
                {
                    array[c]=throwDice();
                    d=d+array[c];
                    c++;
                }
                printf("You got %d and %d.\nYour opponent got %d and %d.\n",array[0],array[1],array[2],array[3]);
                if(a==d)
                    return 0;
                if(a>d)
                    return 1;
                else
                    return -1;
            }

2 个答案:

答案 0 :(得分:4)

每次拨打throwDice时,您都会使用当前时间重新初始化随机数生成器。

时间的准确性只有1秒,所以在这个程序的一次运行中,时间不会改变,所以你会得到相同的结果。

>

>

来自documentation

“使用相同种子的两个不同初始化将在随后的rand调用中生成相同的连续结果。”

答案 1 :(得分:1)

随机数生成器不仅仅是随机抽取随机数。当你种下它时,你给它一个很好的数字开始,从那里它可以生成一堆随机数。

问题是,它会给你一系列随机数,但是如果你连续两次给它一个相同的种子,那个序列就是一样的。这就是为什么你种下它的价值相对随机的重要性。嘿,时间非常随机,两个人在同一时间最终运行程序的机会是多少?

你正在做的是在每次调用rand之前播种发生器,而不是在开始播种并让随机数发生器完成它的工作。由于time仅以秒为单位返回时间(请参阅man page),因此每次循环运行时都会得到相同的数字,直到下一秒的开始。