C - 骰子滚动的模拟器

时间:2015-11-23 03:33:08

标签: c dice

这里的目的是为2个骰子滚动模拟器编写C代码。 它必须以直方图的形式写出答案(10行结果)。 计算并给出骰子卷的最小值,最大值和平均值。以及重复。我不得不承认我现在被困住了。任何帮助将不胜感激。

以下是代码:

   #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100

void initarray(int d[]);
void printarray(int d[]);
void printstar(int n);
void fancyprint(int d[]);
int roll(void);

int main(int argc, char* argv[]) {
{
   int roll(); 
   int d[13]; /* 2-12 hold num of rolls */
   int i;     /* variable de la boucle */
   int starttime = time(NULL); /* temps horloge*/
   srand(1020);

   printf("Simulation de 100 lancees de 2 des");

   for (i = 0; i < N; i++)
      d[roll() + roll()]++;
   printarray(d);
   fancyprint(d);
   printf("Elapsed time: %ld seconds\n",
      time(NULL) - starttime);
   return 0;
}

/* initarray: initialize statistic array */
void initarray(int d[]){
   int i;
   for (i = 2; i < 13; i++)
      d[i] = 0;
}

/* printarray: print each num of rolls */
void printarray(int d[]){
   int i;
   double e[] = {0, 0,
      1.0/36.0, 2.0/36.0, 3.0/36.0, 4.0/36.0,
      5.0/36.0, 6.0/36.0, 5.0/36.0, 4.0/36.0,
      3.0/36.0, 2.0/36.0, 1.0/36.0};
   printf("Sum  Times   Frequency");
   printf("      Exact    Diff\n\n");
   for (i = 2; i < 13; i++)
      printf("%2d %7d %11.7f %10.7f %8.4f\n",
        i,
        d[i],
        (double)d[i]/N*100.0,

        e[i]*100.0,
        ((double)(d[i]) -
           e[i]*N)/N*100.0);
}

/* printstar: print n stars */
void printstar(int n) {
   while (n > 0) {
      printf("*");
      n--;
   }
}


/* fancyprint: print bar graph */
void fancyprint(int d[]){
   int i;
   printf("\n");
   for (i = 2; i < 13; i++) {
      printf("Sum:%3d |", i);

      printstar(300*d[i]/N);

      printf("\n");
   }
   printf("\n");
}

/* roll: simulate rolling a die */
int roll() {
   return (int) (6.0*(rand()/(double)RAND_MAX)
      + 1.0);

return 0;
}
}

1 个答案:

答案 0 :(得分:0)

OP roll()偶尔生成一个7:rand() == RAND_MAX

int roll(void) {
  // return (int) (6.0*(rand()/(double)RAND_MAX) + 1.0);
  return (int) (6.0*(rand()/((double)RAND_MAX + 1) + 1.0);
}

如果(double)RAND_MAX不准确,则上述操作会有问题。

它还有一点偏见。

考虑不使用浮点的其他方法。例如:https://stackoverflow.com/a/17554531/2410359

可能的其他问题。