#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main()
{
int i;
int d1, d2, d3;
int a[16];
srand(time(NULL));
for(i = 0; i <= 15; i++)
a[i] = 0;
for(i = 0; i < 1000; i = i + 1)
{
d1 = rand() % 6 + 1;
d2 = rand() % 6 + 1;
d3 = rand() % 6 + 1;
++a[d1 + d2 + d3 - 3];
}
char asterisks[0x400];
memset(asterisks, '*', sizeof(asterisks));
for(i = 0; i <= 15; i = i + 1)
{
printf("%3d - ", i+3);
for(j=0;j<a[i];j++)
{
printf("%c ",'*');
}
printf("\n");
}
return 0;
}
更新了代码。
目标是有一个星号直方图判断3个骰子的掷骰卷1000次。它计算3到18之间的总和组合数。
直方图输出应如下所示:
Frequency of Results for 3d6
3 - *
4 - **
5 - ****
6 - *******
7 - *********
8 - ***********
9 - ************
10 - ************
11 - *************
12 - **********
13 - *************
14 - ********
15 - ******
16 - ***
17 - ***
18 - **
这是我现在的输出:
3 - * *
4 - * * * * * * * * * * * * * * * * * * * *
5 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
6 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * *
7 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * *
8 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * *
9 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
10 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
11 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * *
12 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * *
13 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * *
14 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * *
15 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * *
16 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
17 - * * * * * * * * *
18 - * * * * * * * *
答案 0 :(得分:1)
您可以使用memset
填充星号和"%*s"
printf
格式的缓冲区,以便根据需要进行打印:
char asterisks[0x400];
memset(asterisks, '*', sizeof(asterisks));
for(i = 3; i <= 18; i = i + 1)
{
printf("%d - %*s\n", i, a[i], asterisks);
}
是的,正如评论中所提到的,你应该定义a
足够长的时间:
int a[19];
答案 1 :(得分:1)
用星号填充char数组的方法可以通过各种方式完成,其中一些已被解释here,这个问题已经发布但几个小时前......
另一方面:
您正在调用rand
函数,而不提供种子......默认情况下,rand
将表现为传递1
作为种子,并且您编译的程序将产生不那么随机的结果
考虑添加:
#include <stdlib.h>
#include <time.h>
int main()
{
int i;
int d1, d2;
int a[13];
srand(time(NULL));//seed current time
}
那,正如Jongware指出的那样:
d1 = rand() % 6 + 1;
d2 = rand() %6 + 1;
只是没有意义:
d1 = rand() % 18 + 1;
做同样的事情,只需要1个函数调用。但是,对于这个int值,你还有另外一个问题:
您还使用了一个整数数组(a[13]
),其声明意味着您可以使用的最高偏移量为12,最低值(如果有)为0.但是,您的循环开始于抵消3,并一直走到18 ...
我知道这个站点叫做stackoverflow,但是你的代码似乎是积极致力于Buffer overflow 。解决这个问题,请...
答案 2 :(得分:1)
3-18
您需要大小为16的数组
int a[16];
a[0] indicates Number of 3 counts and
a[1] indicates Number of 4 counts and
....
a[15] indicates Number of 18 counts.
您需要更改此循环
for(i = 0; i <= 15; i++)
a[i] = 0;
和本声明
a[d1 + d2+d3] = a[d1 + d2 + d3] + 1;
像这样修改
++a[d1 + d2 + d3 - 3];
最后for循环也需要两个循环。
for(i = 0; i <= 15; i = i + 1)
{
printf("%3d - ", i+3);
for(j=0;j<a[i];j++)
{
printf("%c ",'*');
}
printf("\n");
}