我试着在0-6之间做一个随机10000个数字的程序,并检查每个数字得到皱纹的次数。它变得疯狂并打印很多东西。请帮帮我谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_SIZE 10000
#define NUM_OF_FACES 6
int main()
{
srand(time(NULL));
int arrCube[ARR_SIZE];
int i=0,counter=0,j=0;
for(i = 0; i<ARR_SIZE; i++)
{
arrCube[i] = rand() % NUM_OF_FACES;
}
for(i=0;i<ARR_SIZE;i++)
{
counter=0;
for(j=i+1;j<ARR_SIZE -1;j++)
{
if (arrCube[i]==arrCube[j])
{
counter++;
}
}
printf("%d times %d showed up\n",counter,arrCube[i]);
}
return (0);
}
另一件事:我知道我可以使用另一个数组而不是嵌套循环来执行此程序。有人知道吗?
答案 0 :(得分:3)
你只需要一个额外的数组来计算频率:
int main()
{
srand(time(NULL));
int arrCube[ARR_SIZE];
int freqs[NUM_OF_FACES] = {0};
int i=0,counter=0,j=0, val;
for(i = 0; i<ARR_SIZE; i++)
{
val = rand() % NUM_OF_FACES;
arrCube[i] = val;
++freqs[val];
}
for(i =0 ; i < NUM_OF_FACES; i++)
printf("%d showed up %d times\n",i,freqs[i]);
}
答案 1 :(得分:2)
这是另一个代码版本,可以解决您的问题。我试图保持接近你的原始版本。在旧版本中,您检查了每个随机数,与您在数组中出现的次数相同。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_SIZE 10000
#define NUM_OF_FACES 6
int main()
{
srand(time(NULL));
int arrCube[ARR_SIZE];
int i=0,counter=0,j=0,all=0;
for(i = 0; i<ARR_SIZE; i++)
{
arrCube[i] = rand() % NUM_OF_FACES;
}
for(i=0;i<NUM_OF_FACES;i++)
{
counter = 0;
for(j=0;j<ARR_SIZE;j++)
{
if (i==arrCube[j])
{
counter++;
}
}
printf("%d times %d showed up\n",counter,i);
all=all+counter;
}
printf("total %d\n",all);
return (0);
}
答案 2 :(得分:1)
你的嵌套循环确实不是最好的解决方案:你需要迭代的次数超过必要的次数,并且这也导致了比你需要的输出更多的输出:实际上是10,000行。疯狂!
用0→NUM_OF_FACES
上的循环替换数组上的外环。
此外,您可以通过保留数组int frequency[NUM_OF_FACES] = {}
,然后为0→frequency[arrCube[i]]
中的每个i
递增ARR_SIZE
,将嵌套循环折叠为一个。
然后你需要一个新的,最后一个循环frequency
来打印六行结果
答案 3 :(得分:1)
用简单的bucket sort:
替换嵌套循环int bucket[NUM_OF_FACES] = { 0 };
/* Put the "ruffles" in the right bucket */
for (i = 0; i < ARR_SIZE; i++)
{
bucket[arrCube[i]]++;
}
/* Print the result */
for (i = 0; i < ARR_SIZE; i++)
{
printf("%d times %d showed up\n", bucket[i], i);
}
答案 4 :(得分:1)
首先,仅仅因为以下代码,它“变得疯狂”:
<DataTemplate DataType="local:DerivedColumn">
<utils:EditableTextBlock x:Name="editableTextBlock" Text="{Binding Name, Mode=TwoWay}"
IsInEditMode="{Binding IsInEditMode}"/>
</DataTemplate>
printf重复ARR_SIZE次
以下代码最有可能是您想要的:
for(i=0;i<ARR_SIZE;i++)
{
counter=0;
...
printf("%d times %d showed up\n",counter,arrCube[i]);
}