C-骰子滚动模拟器
这里的目的是为2骰子滚动模拟器编写一个C代码。 它必须以直方图的形式写出答案(每行10个结果)。 计算并给出掷骰子的最小值、最大值和平均值。以及复制品。我必须承认我现在陷入困境。任何帮助都将不胜感激 代码如下: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[]);
#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)
asRAND_MAX
当然是2-1的幂`并且将RAND_MAX/2+1
转换为双精度
肯定是准确的。更重要的是,我指的是OP,在没有FP的情况下完成所有这些确实是最好的方式。