滚动骰子直方图

时间:2012-04-16 19:27:18

标签: c generator histogram dice

您好我已经在rand()和time.h上编写了骰子滚动生成器所需的代码。 它基本上要求用户输入他想要掷骰子的次数,然后滚动那些X次。它节省了1-6个数字中每个数字在数组中滚动的次数以及每个数字在另一个数组中的百分比。

现在我要做的是创建一个直方图,其数字为1-6,而在X轴上,百分比和|在Y轴和星(*)列。

这样的事情:

10% | *
 8% |* * *
 6% |* * * * *
 4% |* * * * * *
 2% |* * * * * *
    +------------
     1 2 3 4 5 6

我已经通过谷歌搜索找到了一些东西,但我真的发现了与我的情况类似的东西,这些东西可以帮助我开始。

我的代码是:

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

int random_number();
float calc_percentage(int totals, int nums);
float calc_maxper(float perc[6]);
float calc_minper(float perc[6]);
float permin;
float permax;


int main(void)
{
  int nums;
  int i;
  int totals[6] = {0};
  float percentages[6] = {0};

  srand(time(NULL));

  printf("How many numbers to generate?");
  scanf("%d", &nums);

  for (i = 1; i <= nums; i++)
  {
    int x = random_number();
    totals[x-1]++;
  }

  for (i = 0; i<6; i++)
  {
    percentages[i] = calc_percentage(totals[i],nums);
    printf("The percentage of each number is: %.2f%\n", percentages[i]);
  }


  permin = calc_minper(percentages);
  permax = calc_maxper(percentages);

  if (((permax) - (permin)) > 5)
    printf("The generator is not good.\n");
  printf("The percentage difference is:%.1f\n", permax-permin);

  system("pause");
  return 0;
}



int random_number()
{
  int randnum;
  randnum = 1 + (rand() % 6);

  return randnum;
}

float calc_percentage(int totals, int numbers)
{
  float a;

  a = (totals * 100)/numbers;

  return a;
}

float calc_minper(float perc[6])
{
  int i;
  float min;
  min = perc[0];

  for (i=1; i<6; i++)
  {
    if (perc[i] < min)
      min = perc[i];
  }
  return min;
}

float calc_maxper(float perc[6])
{
  int i;
  float max;
  max = perc[0];

  for (i=1; i<6; i++)
  {
    if (perc[i] > max)
      max = perc[i];
  }
  return max;
}

好的,我终于完成了这件事。

有点长而且凌乱,但绝对可以完成工作!!

printf("20%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 20)
       printf("* ");
}
printf("\n");

printf("16%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 16)
       printf("* ");
}  
printf("\n");


printf("12%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 12)
       printf("* ");
}  
printf("\n");


printf(" 8%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 8)
       printf("* ");
}  
printf("\n");


printf(" 4%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 4)
       printf("* ");
}  



printf("\n");
printf("  +------------\n");   
printf("   1 2 3 4 5 6\n");

谢谢老兄的想法!! 如果你有任何快速的想法让它更短,我的耳朵!

1 个答案:

答案 0 :(得分:1)

对于每个范围(10%,8%等),检查当前骰子数(1-6)百分比是否超过它,然后打印*(如果不符合最小范围,则打印一个空格)。最后,打印图形基础。

您可以使用for来处理范围:

float range;
float interval = (permax-permin)/(NUM_INTERVALS-1);
for (range = permax; range >= permin - EPSILON; range -= interval){
    int i;
    printf("%2.2f%% | ", range);
    for(i=0; i<6; i++){
        char *out = percentages[i] >= range ? "*" : " ";
        printf("%s ", out);
    }
    printf("\n");
}
printf("      | 1 2 3 4 5 6\n");