【问题标题】:Why is the return value on int is the same over? [duplicate]为什么int上的返回值是一样的? [复制]
【发布时间】:2017-04-28 11:01:05
【问题描述】:

S,我正在创建一些基于随机值的游戏。这个游戏应该通过插入一个球队的球员数据和另一支球队的球员数据来预测足球比赛的结果,依此类推。加入比赛数据的球队将添加对手数据。球员的原始数据将被除以二,如果数值触及球队的数据将考虑得分,但如果它在中间,则将其置于概率栏的边缘。

这是代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>

int score_prob(int x,int hh, int aw);

int main()
{
    int i,j,k,a,b,c,n,sc,shome=0,saway=0;
    int p[64][64],x,y,z,ho,aw;
    int t[64],h,w,sem,tand;

    printf("Number Of Team  : ");scanf("%d",&x);
    printf("Number Of Player: ");scanf("%d",&y);

    for(i=0;i<x;i++)
    {
        z = 0;
        printf("\n\n");
        printf("Teamm %d \n",i+1);
        for(j=0;j<y;j++)
        {
            printf(". PLayer %d : " ,(j+1));scanf("%d",&p[i][j]);
            z += p[i][j];
        }
        printf("Stat of team %d = %d",i+1,z);
        t[i] = z;
    }
    srand(time(NULL));

    do
    {
        k = 0;
        printf("\n\n");
        printf("Home Team Number: ");scanf("%d",&a);a = a - 1;
        printf("Away Team Number: ");scanf("%d",&b);b = b - 1;
        for(i=0;i<90;i++)
        {
            i += 4;
            printf("\nMinute %d: ",i+1);
            {
                sem  = t[a] + t[b];
                ho=t[a];aw=t[b];

                sc = score_prob(sem,ho,aw);
                printf("\n              %d\n",score_prob(sem,t[a],t[b]));
                if(sc == 0)
                {
                    shome += 1;
                    printf("Home Score\n");printf(" %d VS %d ",shome,saway);
                }else if(sc == 2)
                {
                    printf(" %d VS %d ",shome,saway);
                }
                else{
                    saway += 1;
                    printf("Away Score\n");printf(" %d VS %d ",shome,saway);
                }
            }
        }
    }while(k == 0);
    return 0;
}

int score_prob(int x,int hh, int aw)
{
   int st,aa,nn,sr=0,sh=0,sa=0,home,away;
   time_t t;
   sh=0;sa=0;
   aw = aw / 2; hh = hh / 2;
   srand((unsigned) time(&t));

   for(nn=0;nn<x;nn++)
   {
        aa = rand() % x;
        if(aa<hh)
        {
            sh += 1;
        }
        if(aa>(aa - aw))
        {
            sa += 1;
        }
        if(aa!=(aa<hh) && aa != (aa<(aa-aw)))
        {
            sr +=1;
        }
   }

   if(sr != 0)
   {
       if(sh<sa)
       {
           st = 1;
       }
       else
       {
           st = 0;
       }
   }
   else
   {
       st = 2;
   }

   return st;
}

【问题讨论】:

  • 不要多次致电srand
  • @luoluo 因为如果你用相同的参数调用它,你会得到相同的随机数——这是 srand 的一部分。如果您的程序花费的时间少于 1 秒,那么您每次调用 time 时都会得到相同的数字(可能)。

标签: c++ c srand


【解决方案1】:

随机数不是完全随机的 =) 有一些带有伪随机数的表格,当您致电 srand() 时,您只需选择其中一张表格。之后,每次调用rand() 都会从所选表中获取一些数字。因此,如果您使用同一个种子多次调用srand(),您将一遍又一遍地获得同一张桌子。

【讨论】:

  • 可能更准确的说法是有一个大表,srand 设置该表中的当前位置,rand 返回表中的下一个数字(向前移动位置) .更准确地说,有一个函数可以根据当前值逐一生成表的每一行。 srand 设置当前值,rand 计算下一个数字(更新当前值)。
  • @TripeHound 是的,感谢您指出 =)
【解决方案2】:

rand '秘密' 是一个递归函数(Linear congruential generator 类型)。这意味着上一次调用的结果将用作下一次调用的输入。由于它将之前的值存储在静态变量中,因此您需要在第一次调用rand 之前自行设置。

您可以在运行时多次重置它,但是由于您可能在同一秒内多次调用srand((unsigned) time(&amp;t));,因此该值似乎是恒定的。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2011-07-01
    • 2020-06-27
    • 2012-10-23
    相关资源
    最近更新 更多