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];
}