Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-骰子滚动模拟器_C_Dice - Fatal编程技术网

C-骰子滚动模拟器

C-骰子滚动模拟器,c,dice,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[]);

这里的目的是为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;
}
}
#包括
#包括
#包括
#定义N 100
void initarray(int d[]);
无效打印数组(int d[]);
无效打印星(int n);
void fancyprint(int d[]);
整数滚动(无效);
int main(int argc,char*argv[]){
{
int roll();
int d[13];/*2-12保持卷数*/
int i;/*变量de la boucle*/
int starttime=时间(空);/*临时水平*/
srand(1020);
printf(“模拟100兰塞斯2德”);
对于(i=0;i0){
printf(“*”);
n--;
}
}
/*fancyprint:打印条形图*/
void fancyprint(int d[]){
int i;
printf(“\n”);
对于(i=2;i<13;i++){
printf(“总和:%3d |”,i);
printstar(300*d[i]/N);
printf(“\n”);
}
printf(“\n”);
}
/*滚动:模拟滚动模具*/
int roll(){
返回值(整数)(6.0*(rand()/(double)rand_MAX)
+ 1.0);
返回0;
}
}
OP的
roll()
偶尔会生成一个7:当
rand()==rand\u 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
不准确,上述操作将出现问题

它还有一个小偏差

考虑其他不使用浮点的方法。例如:


可能的其他问题。

谢谢,我会尝试此操作。
+1.0
可能在cast@M.M可以做到这一点,更好的是
((双精度)(RAND_MAX/2+1)*2.0)
as
RAND_MAX
当然是2-1的幂`并且将
RAND_MAX/2+1
转换为
双精度
肯定是准确的。更重要的是,我指的是OP,在没有FP的情况下完成所有这些确实是最好的方式。