随机骰子卷3个骰子的星号直方图

时间:2013-10-21 13:22:17

标签: c random histogram dice

#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 - * * * * * * * * 

3 个答案:

答案 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");  
   }