Гистограмма звездочки для случайных бросков 3 кубиков

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

person user2306249    schedule 21.10.2013    source источник
comment
а в чем проблема?   -  person Sergey L.    schedule 21.10.2013
comment
Если a определен как массив из 13 записей, как вы можете получить доступ до [18]? А я считаю всего 2 кубика ..   -  person Leeor    schedule 21.10.2013
comment
@Leeor: stack-overflow ... buffer-overflow ... опубликованный код, похоже, очень хорошо соответствует названию сайта: p   -  person Elias Van Ootegem    schedule 21.10.2013
comment
@EliasVanOotegem Прошу прощения, я пытаюсь узнать, пока мы идем сюда ...   -  person user2306249    schedule 21.10.2013
comment
@ user2306249: Не беспокойтесь ... Я попытался ответить на ваш вопрос, указав несколько проблем, которые вам следует решить, я надеюсь, что это поможет вам на вашем пути   -  person Elias Van Ootegem    schedule 21.10.2013
comment
@ user2306249: Вместо того, чтобы писать ++a[d1 + d2 + d3 - 3], почему бы не удалить +1 из всех этих d1 = rand() % 6 + 1; строк?   -  person Elias Van Ootegem    schedule 21.10.2013


Ответы (3)


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");  
   }
person Gangadhar    schedule 21.10.2013
comment
откуда взялась буква j? - person user2306249; 21.10.2013
comment
@ user2306249 Вам нужно объявить дополнительную переменную. - person Gangadhar; 21.10.2013

Вы можете использовать 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];
person Sergey L.    schedule 21.10.2013

Заполнить массив символов звездочками можно разными способами, некоторые из которых были объяснены здесь, вопрос, который был опубликован несколько часов назад ...

По другому вопросу:
Вы вызываете функцию 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
}

Это, и, как указал Джонгвер:

d1 = rand() % 6 + 1;
d2 = rand() %6 + 1;

просто не имеет смысла:

d1 = rand() % 18 + 1;

Делает то же самое, требуя только 1 вызова функции. Но все же есть еще одна проблема с тем, что вы делаете с этим значением int:

Вы также используете массив целых чисел (a[13]), объявление которого подразумевает, что максимальное смещение, которое вы можете использовать, равно 12, а самое низкое (как всегда) равно 0. Тем не менее, ваши циклы начинаются со смещения 3 и проходят все до 18 лет ...
Я знаю, что этот сайт называется stackoverflow, но ваш код, похоже, активно работает над Переполнение буфера. Исправьте это, пожалуйста ...

person Elias Van Ootegem    schedule 21.10.2013
comment
Менее очевидная оптимизация: вызовите rand один раз для диапазона 3..18. - person Jongware; 21.10.2013
comment
@Jongware: Вы правы (я добавил это к своему ответу, веря вам), но у OP есть большая рыба, чтобы поджарить IMO ... ни в коей мере: проблема переполнения - person Elias Van Ootegem; 21.10.2013
comment
Гм, я предлагал начать с 3 - вы можете как минимум бросить три :-) (Как прокомментировал elsethread, диапазон 0..15 работает точно тем же.) - person Jongware; 21.10.2013