Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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 我如何保存随机数并计算它们在整个游戏中出现的次数?_C_Random_Save - Fatal编程技术网

C 我如何保存随机数并计算它们在整个游戏中出现的次数?

C 我如何保存随机数并计算它们在整个游戏中出现的次数?,c,random,save,C,Random,Save,所以我试着做彩票游戏,我应该写下在整个游戏中出现在统计数据中的前三位数字。但我不知道如何保存或计算一个数字出现的次数 int i,s,ans,ans1; MENU: ; srand(time(0)); printf("[1]-Play The Game\n[2]-Statistics\n"); scanf(" %d",&ans1); if(ans1==1){ PLAY: ; for(i=1;i<=5;i++){ s=1+rand()%9; pr

所以我试着做彩票游戏,我应该写下在整个游戏中出现在统计数据中的前三位数字。但我不知道如何保存或计算一个数字出现的次数

int i,s,ans,ans1;
 MENU: ;
srand(time(0));
printf("[1]-Play The Game\n[2]-Statistics\n");
scanf(" %d",&ans1);

if(ans1==1){

PLAY: ;
    for(i=1;i<=5;i++){
      s=1+rand()%9;
      printf("%d.number=%d \n",i,s); }

 QUESTION: ;
  printf("\nWant to roll again? \n [1]-Yes\n[2]-No\nAnswer:");
  scanf("%d",&ans);
      if(ans==1)
        goto PLAY;
      else if (ans==2)
        goto MENU;
      else
        goto QUESTION;
  }

   else if (ans1==2){
    printf("\n\t Welcome to Statitistics");

    for(int a=0;a<3;a++){
        printf("\n%d",s);
    }

   }
  return 0;
 }
inti、s、ans、ans1;
菜单:;
srand(时间(0));
printf(“[1]-玩游戏\n[2]-统计\n”);
scanf(“%d”和&ans1);
如果(ans1==1){
播放:;

对于(i=1;i创建一个二维数组,由可能的数字及其cnt组成。(可能的数字1-9,每个数字的cnt=0) 每次生成随机数时,递增该数的计数

创建一个函数以从数组中查找最大值3。 On show statistics逻辑通过传递先前创建的2D数组来调用它。 它将找到前3个数字

#define SIZE 10
int f[SIZE]; // increment f[x] each time x appears in the lottery
void find3max_count(int *a, int *b, int *c){
    *a = *b = *c = 0;
    int fa = -1, fb = -1, fc = -1;
    for(int i = 0; i < SIZE; i++){
        if(f[i] > fa){
            *c = *b; fc = fb;
            *b = *a; fb = fa;
            *a = i; fa = f[i];
        }else if(f[i] > fb){
            *c = *b; fc = fb;
            *b = i; fb = f[i];
        }else if(f[i] > fc){
            *c = i; fc = f[i];
        }
    }
}
在它被执行之后,a、b和c将拥有彩票中出现最多的数字

如果您有更多的数字可以计数和查找,排序可能会更有用

typedef struct {
    int x, freq;
} freq_elem;
freq_elem f[SIZE];
初始化为:

for(int i = 0; i < SIZE; i++){
    f[i].x = i;
    f[i].freq = 0;
}
比较两个频率元素的函数:

int cmp(const void* a, const void* b){
    return ((freq_elem*)b)->freq - ((freq_elem*)a)->freq; // order by freq in decreasing order
}
职能:

void find_k_maxCount(freq_elem v[], int k){
    qsort(f, SIZE, sizeof(freq_elem), cmp);
    for(int i = 0; i < k; i++)
        v[i] = f[i];
}
void find_k_maxCount(freq_elem v[],int k){
qsort(f,SIZE,sizeof(freq_elem),cmp);
for(int i=0;i

调用此函数后,数组
v
将有
k
元素,这些元素在抽签过程中出现得最多。

有些情况下使用
goto
是可以的。而不是循环不是这些情况之一。此外,您应该只调用
srand
一次。此代码只是原型。我只想知道如何保持t计算数字出现的次数。但是感谢您的响应,您可以得到九个不同的值,从
1
9
。用数组存储它们的计数如何?正如@user3121023所写,创建一个数组
int counts[]
其中
计数[i]
将包含
i
-第个数字的出现次数。通过写入
静态整数计数[9]={0};
您将分配一个静态持续时间数组,用于存储9个数字(索引0到8),最初初始化为零。然后,您将为每个随机数增加值,即
+计数[s-1]
。请注意,
计数[9]
在数组的边界之外,并且您的
s
包含值1到9。因此,为了简单起见,另一种方法是初始化
计数
以存储10个数字,然后使用
++counts[s]考虑添加一些代码示例,对于可能的数字的小范围来说,它将更干净,使用一维数组更简单,如对OP的注释。
int cmp(const void* a, const void* b){
    return ((freq_elem*)b)->freq - ((freq_elem*)a)->freq; // order by freq in decreasing order
}
void find_k_maxCount(freq_elem v[], int k){
    qsort(f, SIZE, sizeof(freq_elem), cmp);
    for(int i = 0; i < k; i++)
        v[i] = f[i];
}