2013-10-21 54 views
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 直方图输出之间的计数总和的多少组合应该是这样的:3个骰子的随机骰子卷的星号直方图

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 - * * * * * * * * 
+2

这是什么问题? –

+3

如果a被定义为13个条目的数组,那么如何访问最多18个?我只计算2个骰子.. – Leeor

+0

@Leeor:堆栈溢出...缓冲区溢出...发布的代码似乎与网站名称相当吻合:p –

回答

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"); 
    } 
+0

j从哪里来? – user2306249

+0

@ user2306249您需要声明附加变量。 – Gangadhar

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

填充字符数组用星号可以通过多种方式来实现的方式,其中的一些已经解释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。修复,请...

+0

不太明显的优化:调用'rand'一次,范围为3..18。 – usr2564301

+0

@Jongware:你说得对(我已经把这个添加到我的答案中,记入你了),但是OP有更大的鱼去炸IMO ......没什么问题:溢出问题 –

+0

呃,我的建议是开始在** 3 **处 - 你至少可以扔三个:-)(正如其他线程所评论的,“0..15”的范围*完全相同。) – usr2564301