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

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

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

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

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

нужно создать функциу которая генерирует число от 1 до 6, вероятность что выпадет 6 20% а число 1-5 16%
подскажите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2014, 16:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Имитация игры с костями, вероятность шести - наибольшая (C++):

Составить программу покрытия таблицы соответствующими доминошными костями из одного набора - C++
Элементами заданной прямоугольной таблицы являются числа от 0 до 6.Составить программу покрытия таблицы соответствующими костями из 1-го...

Задача с игральными костями. Найти вероятность события - Теория вероятностей
Брошены две игральные кости.Найти вероятность следующего события: удвоенный модуль разности выпавших очков больше или равен их...

Теория вероятности. Найти вероятность осуждения шести обвиняемых. - Теория вероятностей
Помогите, плиз решить: Вероятность раскрытия следователем уголовного дела = 0,75, вероятность вынесения обвинительного договора в суде =...

Найти вероятность события, что из шести выстрелов было три удачных - Теория вероятностей
Стрелок делает 6 выстрелов в тире. Вероятность успеха в каждом выстреле равна 0,7. Найти вероятность события, что из шести выстрелов было...

Найти вероятность того, что из шести купленных изделий первосортными окажутся три - Теория вероятностей
Помогите решить задачу, пожалуйста! Фабрика выпускает 75% продукции первого сорта. Найти вероятность того, что из шести купленных...

Найти вероятность того, что среди выбранных шести шаров не менее 4-х белых - Теория вероятностей
В группе 7 студентов имеют высокие балы, 12-средние, 8-низкий рейтинг. Наугад выбирают 6 студентов, найти вероятность того ,что среди них...

32
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
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;
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,543
21.07.2014, 12:49 #17
ValeryS, ок.
скромный вопрос, а где я написал код а=rand()%2?
Что касается 6, то там отдельная "вероятность". Честно говоря, я немного удивлен находчивости ТС по вычислению вероятности. Я далеко не эксперт по программированию, но ни разу не помню, чтобы можно было задавать вероятность появления определенных чисел в генераторе

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

Цитата Сообщение от Supernatural Посмотреть сообщение
я немного удивлен находчивости ТС
Вот и слово нашли подходящее - находчивость. А то я долго думал, как это назвать, чтобы без мата. Предлагаю ввести на форуме такой локальный мем - находчивость. И всем сразу понятно, что имеется в виду код как у ТС.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 13:01 #19
Цитата Сообщение от Supernatural Посмотреть сообщение
и да, не совсем понимаю использование rand_max )))
RAND_MAX всего навсего определяет максимальное значение которое может вернуть rand()
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,543
21.07.2014, 13:19 #20
Цитата Сообщение от Ilot Посмотреть сообщение
RAND_MAX всего навсего определяет максимальное значение которое может вернуть rand()
ну понятно, что максимум, но какую роль играет в этом эпизоде, когда надо вернуть от 0-5? )))) 6 я не считаю, потому что по "условию" там другая "вероятность".
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
21.07.2014, 13:48 #21
Цитата Сообщение от Supernatural Посмотреть сообщение
скромный вопрос, а где я написал код а=rand()%2?
А это кто писал?
Цитата Сообщение от Supernatural Посмотреть сообщение
да, проверил вывод при rand()%1 и при rand()%2, в первом случае кроме 0 я ничего не получил, во втором случае появлялись 1
Цитата Сообщение от Supernatural Посмотреть сообщение
Что касается 6, то там отдельная "вероятность".
в твоем решении она вообще не выпадает
Цитата Сообщение от Supernatural Посмотреть сообщение
и да, не совсем понимаю использование rand_max )))
для правильного распределения % не подходит
для статистики используется формула
случайное число разделить на максимум тогда мы получаем число в диапазоне от 0 до 1(дробное)
умножаем на нужный нам диапазон округляем и получаем число в нужном нам диапазоне

вот код
C++
1
2
double tmp=(double)rand()/RAND_MAX;// число от 0 до 1
int m=tmp*n;
чтобы не связываться с плавающими я изменил порядок вычисления
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,543
21.07.2014, 13:53 #22
Цитата Сообщение от ValeryS Посмотреть сообщение
А это кто писал?
это я перепроверял себя, не пишу ли я чепуху.
Цитата Сообщение от ValeryS Посмотреть сообщение
в твоем решении она вообще не выпадает
в каком решении?
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
21.07.2014, 14:06 #23
Цитата Сообщение от Supernatural Посмотреть сообщение
в каком решении?
это что?
Цитата Сообщение от Supernatural Посмотреть сообщение
C++
1
2
3
4
srand(time(0));
a=rand()%6;
if (a==0) a++; //если а=0, то прибавляем 1
cout<<a;
вот статья насчет ранда
в комментарии сказано насчет распределения и чем плох %
http://younglinux.info/c/rand
0
Vtulhu
371 / 377 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:09 #24
Вот, довел функцию до идеала. Максимальная производительность, минимум операций. Кто сможет лучше?

C
1
2
3
4
5
6
7
8
int con_dice(void)
{
    int d = rand();
    if( d < RAND_MAX / 5 ) {
        return 6;
    }
    return d / ((RAND_MAX + 1) / 5) + 1;
}
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
21.07.2014, 14:17 #25
Цитата Сообщение от Vtulhu Посмотреть сообщение
Максимальная производительность, минимум операций. Кто сможет лучше?
я могу
показал уже, табличный метод никаких ветвлений
для еще большей крутизны можно перемешать массив
Цитата Сообщение от Vtulhu Посмотреть сообщение
Я только не понял, почему ValeryS считает, что делить числовую прямую на отрезки лучше.
есть веши которые я изучал очень давно, и чтобы привести доказательства мне нужно поднять литературу
но посмотри комментарий по ссылке

когда найду более строгое доказательство, приведу конечно
Цитата Сообщение от Vtulhu Посмотреть сообщение
как я до этого не видел ни у кого и никогда:
Это очень старое решение в последнее время не практикуется
Сам грешен, пользуюсь Лень формулы писать
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,543
21.07.2014, 14:34 #26
ValeryS, я предложил лишь вариант)
мне интересно, где в коде расчет тех самых 20 %(6) и 16%(1-5) вероятности появления цифр, просветите неуча
0
Vtulhu
371 / 377 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:45 #27
Посмотрел по ссылке и пожалел, что дал переубедить себя. Изначально мой код, конечно, выглядел вот так:

C
1
2
3
4
5
6
7
8
int con_dice(void)
{
    int d = rand();
    if( d < RAND_MAX / 5 ) {
        return 6;
    }
    return d % 5 + 1;
}
Любому дураку ясно, что функция rand подходит, только если количество чисел, которые нам нужно генерировать, хотя бы на один порядок меньше, чем RAND_MAX. Точнее, (RAND_MAX + 1), но когда речь идет о порядках, единица уже не играет роли. Если нам нужно больше чисел, нужно искать альтернативные пути. Нагуглить альтернативную реализацию rand. Подключить библиотечную функцию с каким-нибудь вихрем Мерсенна. В конце-концов, воспользоваться GenCryptRandom, если не пугает анальное рабствовендор-локинг. У меня есть собственный метод, основанный на хэшировании внешних данных алгоритмом Murmur2A.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
21.07.2014, 15:25 #28
Цитата Сообщение от Supernatural Посмотреть сообщение
мне интересно, где в коде расчет тех самых 20 %(6) и 16%(1-5)
ты про мой код имеешь ввиду?
тогда объяснюсь
изначально из 100% чисел мы можем выбрать 16 единиц двоек троек четверок и пятерок и 20 шестерок
можно забабахать массив на 100 элементов и записать туда 16 единиц двоек троек четверок и пятерок и 20 шестерок
но поскольку и 100 и 16 и 20 делится на 4 то я сократил массив
получилось всех по 4 и шестерок 5
размер массива стал 25
далее случайно выбираем число в диапазоне 0 -24 и выводим на экран число которое записано в массиве
выборка из массива очень быстрая операция в отличии от ветвления


Vtulhu, генератор случайной последовательности есть слабое место в любом программном продукте
ибо машна не знает что есть случайность
посему и придумано куча алгоритмов и какой куда ставить решает программист

Добавлено через 1 минуту
Цитата Сообщение от Vtulhu Посмотреть сообщение
Любому дураку ясно, что функция rand подходит, только если количество чисел, которые нам нужно генерировать, хотя бы на один порядок меньше,
и желательно чтобы диапазон был кратен степени двойки тогда % даст нормальное распределение
0
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
21.07.2014, 16:49 #29
хватит спорить, вот вам правильный код:

C++
1
2
3
int a=rand()%100;
if(a<20) return 6;
else return rand()%5+1;
почему вы всё усложняете?

Добавлено через 53 секунды
можно обойтись без переменной, но это уже профессионально:

C++
1
2
if(rand()%100<20) return 6;
else return rand()%5+1;
Добавлено через 1 минуту
А вот вам с меньшими обьёмами данных

C++
1
2
if(rand()%5==0) return 6;
else return rand()%5+1;
Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
Vtulhu, генератор случайной последовательности есть слабое место в любом программном продукте
ибо машна не знает что есть случайность
посему и придумано куча алгоритмов и какой куда ставить решает программист
рандомность берётся из расчёта времени, так что тут очень какая максимальная рандомность, т.к. там оперируется не так что эту секунду выдаёт 1, а на следующую 2, а на следующую 3, там всё намного точнее, по операциям процессора, у каждого по разному нагружен, но если у кого-то он нагружен сильно, то и точность случайности выше.

Проводились эксперименты с подбрасыванием рубля и отчётом с шансом выпадения орла и решки, кто-то там сделал 18000 раз, и помню что в учебнике, в котором это говорилось, что чем больше экспериментов, тем больше точность, так что в программе можете сделать массив из 999999 случайных чисел, потом ещё одно случайное число и выбрать массив[случайное число], умножит это случайное число на элемент массива поделить на случайное число и тогда вам РЕАЛЬНО достанется СЛУЧАЙНОЕ число

Добавлено через 1 минуту
единственная проблема это случайные числа до 35000примерно даются, а вот если хочется больше, то без специальных алгоритмов прийдётся пожертвовать точностью
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,081
21.07.2014, 16:51 #30
Цитата Сообщение от Krock21rus Посмотреть сообщение
вам РЕАЛЬНО достанется СЛУЧАЙНОЕ число
любое число всегда случайное
говорить можно о последовательности
если в последовательности не наблюдается закономерности она случайная, а отдельное число с чем будешь сравнивать? какое ожидание числа?
0
21.07.2014, 16:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 16:51
Привет! Вот еще темы с ответами:

Задача с костями. (подбрасывают 6 раз одну кость) - Теория вероятностей
Игральную кость подбрасывают 6 раз. А)6 раз выпадет одинаковое число очков Б) сумма выпавших очков четна

Какова вероятность выигрыша всей игры для второго шахматиста? - Теория вероятностей
Два шахматиста условились сыграть 5 результативных партий.Вероятноть выиграша каждой отдельной партии первым шахматистом равна 2/3, а...

Найти вероятность того, что все мячи, взятые для второй игры новые. - Теория вероятностей
В ящике находятся 12 мячей, из которых 5 новых. Для первой игры наугад берутся три мяча, которые после игры возвращаются в ящик. Для второй...

В корзине 9 мячей из них 6 новые. Найти вероятность того, что для второй игры взяли 3 новых мяча - Теория вероятностей
Помогите пожалуйста решить задачу. В корзине 9 мячей из них 6 новые . Для первой игры берут три после чего возвращают. Для второй снова...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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