我的节目变得疯狂

时间:2016-01-04 12:58:38

标签: c

我试着在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);
}

另一件事:我知道我可以使用另一个数组而不是嵌套循环来执行此程序。有人知道吗?

5 个答案:

答案 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]);
}