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

3 回答 3

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];
于 2013-10-21T13:26:23.923 回答
1

用星号填充 char 数组的方法可以通过多种方式完成,其中一些已在此处进行了解释,这是几个小时前发布的问题...

在另一件事上:
您在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 值所做的工作还有另一个问题:

您还使用了一个 ints ( a[13]) 数组,其声明意味着您可以使用的最高偏移量是 12,最低(一如既往)是 0。然而,您的循环从偏移量 3 开始,一直持续下去最多 18...
我知道这个站点叫做 stackoverflow,但是你的代码似乎正在积极地朝着Buffer overflow方向努力。解决这个问题,请...

于 2013-10-21T13:33:57.070 回答
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 循环

 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");  
   }
于 2013-10-21T13:43:15.403 回答