Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Serg_yer
0 / 0 / 0
Регистрация: 14.07.2014
Сообщений: 4
#1

Имитация игры с костями, вероятность шести - наибольшая - C++

20.07.2014, 16:06. Просмотров 906. Ответов 32
Метки нет (Все метки)

нужно создать функциу которая генерирует число от 1 до 6, вероятность что выпадет 6 20% а число 1-5 16%
подскажите пожалуйста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
Нарушитель
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 1
20.07.2014, 16:26     Имитация игры с костями, вероятность шести - наибольшая #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Генерируй случайное число 0-99 и каждому значению 1-6 для кости назначь диапазон.
1 0-15
...
6 80-99
Serg_yer
0 / 0 / 0
Регистрация: 14.07.2014
Сообщений: 4
20.07.2014, 16:55  [ТС]     Имитация игры с костями, вероятность шести - наибольшая #3
а так правильно?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# include <iostream>
# include <ctime>
using namespace std;
 
int dice1_5()
{
    return rand() % 5 + 1;
 
 
}
 
int dice6()
{
 
    return 6;
}
 
 
int dice()
{
 
    return rand() % 100 + 1;
 
}
 
int main()
{
    srand(time(0));
 
    for (int i = 1; i <= 10; i++)
    {
        if (dice() >= 1 && dice() <= 20)
            cout << dice6() << " ";
        else if (dice() >= 21 && dice() <= 100)
            cout << dice1_5() << " ";
    }
    system("pause");
 
}
Supernatural
286 / 142 / 28
Регистрация: 22.11.2010
Сообщений: 1,467
20.07.2014, 17:15     Имитация игры с костями, вероятность шести - наибольшая #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
генерация числа:
C++
1
2
3
4
srand(time(0));
a=rand()%6;
if (a==0) a++; //если а=0, то прибавляем 1
cout<<a;
с вероятностью помочь не могу
нет, стоп, там ошибочка (я еще не проснулся, извиняюсь), если поставить rand%5 - будут выпадать числа от 0 до 4, тогда надо будет проверять на случай появления 0,

Добавлено через 6 минут
Правильней будет rand%6, тогда 0-5, и делать проверку, если равно 0, то прибавить 1
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
20.07.2014, 17:18     Имитация игры с костями, вероятность шести - наибольшая #5
Надеюсь логику понял правильно.
C++
1
2
3
4
5
int dice() {
    int value = (rand() % 100) >> 4;
    if ( value > 5 ) value = 5;
    return value + 1;
}
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
20.07.2014, 17:30     Имитация игры с костями, вероятность шести - наибольшая #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
2
3
4
5
6
7
8
9
10
11
int con_dice()
{
    int d = rand() % 100;
    if( d > 79 ) {
        d = 6;
    } else {
        d /= 16;
        ++d;
    }
    return d;
}
Serg_yer
0 / 0 / 0
Регистрация: 14.07.2014
Сообщений: 4
20.07.2014, 17:57  [ТС]     Имитация игры с костями, вероятность шести - наибольшая #7
Цитата Сообщение от Serg_yer Посмотреть сообщение
а так правильно?
получается мой код не правильный?
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
20.07.2014, 21:39     Имитация игры с костями, вероятность шести - наибольшая #8
Забавно. Жутко неправильный, неграмотный код, выдающий тотальное непонимание сути происходящего.

Этот код будет выдавать 6 в 20% случаев, числа 1-5 в 64% случаев, а в остальных 16% случаев - ничего.

Ваша проблема в математике и логике. Прочтите какую-нибудь книжку типа "Искусство правильно мыслить".
Alex5
1032 / 695 / 102
Регистрация: 12.04.2010
Сообщений: 1,753
20.07.2014, 22:17     Имитация игры с костями, вероятность шести - наибольшая #9
Цитата Сообщение от Serg_yer Посмотреть сообщение
создать функцию, которая генерирует число от 1 до 6, , вероятность что выпадет 6 20% а число 1-5 16%
Цитата Сообщение от Serg_yer Посмотреть сообщение
получается мой код не правильный?
Serg_yer, Ваш код нельзя назвать неправильным, т.к. код такой функции отсутствует.

Добавлено через 27 минут
Цитата Сообщение от Serg_yer Посмотреть сообщение
а так правильно?
Цитата Сообщение от Serg_yer Посмотреть сообщение
C++
1
2
3
4
if (dice() >= 1 && dice() <= 20)
 cout << dice6() << " ";
 else if (dice() >= 21 && dice() <= 100)
 cout << dice1_5() << " ";

Serg_yer, Вы здесь пропустили блок else{}.

C++
1
2
3
4
5
6
if (dice() >= 1 && dice() <= 20)
 { /**/}
 else if (dice() >= 21 && dice() <= 100)
 { /**/}
 else 
  { /* Считаете ли Вы, что мы никогда не попадём в эту точку? */ }
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 07:13     Имитация игры с костями, вероятность шести - наибольшая #10
Serg_yer, твой код не правильный потому что ты вызываешь dice() несколько раз.
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 371
Завершенные тесты: 2
21.07.2014, 10:34     Имитация игры с костями, вероятность шести - наибольшая #11
согласен с castaway, как же вы, профессионалы не заметили такой промах:
if (dice() >= 1 && dice() <= 20)
функция тут запускается 2 раза и генерирует 2 раза разное число, то есть вначале сгенерирует что-то, проверит на >=1, если верно сгенерирует ещё раз НОВОЕ, ДРУГОЕ число и проверит на <=20, если повезёт, то условие пройдёт, но шанс мал, меньше 20%, правильно сделать так:
if(dice()<=20) , т.к. смысл проверять >=1 нет, т.к. функция вернёт от 1го до 100
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
21.07.2014, 10:49     Имитация игры с костями, вероятность шести - наибольшая #12
Цитата Сообщение от Supernatural Посмотреть сообщение
Правильней будет rand%6, тогда 0-5, и делать проверку, если равно 0, то прибавить 1
Я правильно понимаю что 6 никогда не выпадет?

Добавлено через 4 минуты
Цитата Сообщение от Serg_yer Посмотреть сообщение
число от 1 до 6, вероятность что выпадет 6 20% а число 1-5 16%
самый простой вариант
C++
1
2
3
4
5
6
int table[25]={1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,6};
int fnc()
{
 return table[rand()%25};
 
}
Supernatural
286 / 142 / 28
Регистрация: 22.11.2010
Сообщений: 1,467
21.07.2014, 11:51     Имитация игры с костями, вероятность шести - наибольшая #13
Цитата Сообщение от ValeryS Посмотреть сообщение
Я правильно понимаю что 6 никогда не выпадет?
да, проверил вывод при rand()%1 и при rand()%2, в первом случае кроме 0 я ничего не получил, во втором случае появлялись 1
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
21.07.2014, 12:00     Имитация игры с костями, вероятность шести - наибольшая #14
Цитата Сообщение от Supernatural Посмотреть сообщение
проверил вывод при rand()%1
расскажи какой остаток от деления на 1???
Цитата Сообщение от Supernatural Посмотреть сообщение
во втором случае появлялись 1
всегда!
Supernatural
286 / 142 / 28
Регистрация: 22.11.2010
Сообщений: 1,467
21.07.2014, 12:09     Имитация игры с костями, вероятность шести - наибольшая #15
ValeryS, к чему клонишь?
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
21.07.2014, 12:22     Имитация игры с костями, вероятность шести - наибольшая #16
Цитата Сообщение от Supernatural Посмотреть сообщение
ValeryS, к чему клонишь?
к тому что написано у тебя неправильно
C++
1
2
a=rand()%2;
if (a==0) a++; //если а=0, то прибавляем 1
остаток от деления на 2 это 0 или 1
если 0 прибавляем 1
итого всегда 1
теперь вернемся к оригиналу
C++
1
2
3
4
srand(time(0));
a=rand()%6;
if (a==0) a++; //если а=0, то прибавляем 1
cout<<a;
как ты правильно отметил остаток от деления на 6 лежит в диапазоне 0-5
если выпало 0 прибавим 1 будет
если 1, 2 , 3 , 4, 5 то ничего не делаем
результат 6 никогда не выпадет
а 1 будет появляться чаще остальных
выбрось иф и будет тебе щастье
C++
1
2
3
4
srand(time(0));
a=rand()%6;
 a++; 
cout<<a;
диапазон от 1 до 6

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

по правильному нужно так
C++
1
a=rand()*6/RAND_MAX+1;
Supernatural
286 / 142 / 28
Регистрация: 22.11.2010
Сообщений: 1,467
21.07.2014, 12:49     Имитация игры с костями, вероятность шести - наибольшая #17
ValeryS, ок.
скромный вопрос, а где я написал код а=rand()%2?
Что касается 6, то там отдельная "вероятность". Честно говоря, я немного удивлен находчивости ТС по вычислению вероятности. Я далеко не эксперт по программированию, но ни разу не помню, чтобы можно было задавать вероятность появления определенных чисел в генераторе

Добавлено через 5 минут
и да, не совсем понимаю использование rand_max )))
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 13:01     Имитация игры с костями, вероятность шести - наибольшая #18
Цитата Сообщение от Krock21rus Посмотреть сообщение
согласен с castaway, как же вы, профессионалы не заметили такой промах:
Это ты не заметил того факта, что все это заметили. Вспоминается эпизод из фильма "Тупой и еще тупее", где герой Джима Керри узнал, что американцы, оказывается, на Луне побывали, и начал это другим рассказывать...

Цитата Сообщение от Supernatural Посмотреть сообщение
я немного удивлен находчивости ТС
Вот и слово нашли подходящее - находчивость. А то я долго думал, как это назвать, чтобы без мата. Предлагаю ввести на форуме такой локальный мем - находчивость. И всем сразу понятно, что имеется в виду код как у ТС.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 13:01     Имитация игры с костями, вероятность шести - наибольшая #19
Цитата Сообщение от Supernatural Посмотреть сообщение
и да, не совсем понимаю использование rand_max )))
RAND_MAX всего навсего определяет максимальное значение которое может вернуть rand()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 13:19     Имитация игры с костями, вероятность шести - наибольшая
Еще ссылки по теме:

Наибольшая возрастающая подпоследовательность за O(NlogN) C++
C++ Вычислить значение cos шести градусов с точностью до 0,001
C++ Составить программу покрытия таблицы соответствующими доминошными костями из одного набора
C++ Вывести слова, которые состоят не из шести символов
Найти два элемента, разность которых наибольшая C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Supernatural
286 / 142 / 28
Регистрация: 22.11.2010
Сообщений: 1,467
21.07.2014, 13:19     Имитация игры с костями, вероятность шести - наибольшая #20
Цитата Сообщение от Ilot Посмотреть сообщение
RAND_MAX всего навсего определяет максимальное значение которое может вернуть rand()
ну понятно, что максимум, но какую роль играет в этом эпизоде, когда надо вернуть от 0-5? )))) 6 я не считаю, потому что по "условию" там другая "вероятность".
Yandex
Объявления
21.07.2014, 13:19     Имитация игры с костями, вероятность шести - наибольшая
Ответ Создать тему
Опции темы

Текущее время: 11:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru