Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 14.07.2014
Сообщений: 4

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

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

Студворк — интернет-сервис помощи студентам
нужно создать функциу которая генерирует число от 1 до 6, вероятность что выпадет 6 20% а число 1-5 16%
подскажите пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.07.2014, 16:06
Ответы с готовыми решениями:

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

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

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

32
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
21.07.2014, 13:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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
619 / 218 / 51
Регистрация: 22.11.2010
Сообщений: 1,781
Записей в блоге: 3
21.07.2014, 13:53
Цитата Сообщение от ValeryS Посмотреть сообщение
А это кто писал?
это я перепроверял себя, не пишу ли я чепуху.
Цитата Сообщение от ValeryS Посмотреть сообщение
в твоем решении она вообще не выпадает
в каком решении?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
21.07.2014, 14:06
Цитата Сообщение от 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
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:09
Вот, довел функцию до идеала. Максимальная производительность, минимум операций. Кто сможет лучше?

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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
21.07.2014, 14:17
Цитата Сообщение от Vtulhu Посмотреть сообщение
Максимальная производительность, минимум операций. Кто сможет лучше?
я могу
показал уже, табличный метод никаких ветвлений
для еще большей крутизны можно перемешать массив
Цитата Сообщение от Vtulhu Посмотреть сообщение
Я только не понял, почему ValeryS считает, что делить числовую прямую на отрезки лучше.
есть веши которые я изучал очень давно, и чтобы привести доказательства мне нужно поднять литературу
но посмотри комментарий по ссылке

когда найду более строгое доказательство, приведу конечно
Цитата Сообщение от Vtulhu Посмотреть сообщение
как я до этого не видел ни у кого и никогда:
Это очень старое решение в последнее время не практикуется
Сам грешен, пользуюсь Лень формулы писать
0
619 / 218 / 51
Регистрация: 22.11.2010
Сообщений: 1,781
Записей в блоге: 3
21.07.2014, 14:34
ValeryS, я предложил лишь вариант)
мне интересно, где в коде расчет тех самых 20 %(6) и 16%(1-5) вероятности появления цифр, просветите неуча
0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:45
Посмотрел по ссылке и пожалел, что дал переубедить себя. Изначально мой код, конечно, выглядел вот так:

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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
21.07.2014, 15:25
Цитата Сообщение от 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
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
21.07.2014, 16:49
хватит спорить, вот вам правильный код:

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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
21.07.2014, 16:51
Цитата Сообщение от Krock21rus Посмотреть сообщение
вам РЕАЛЬНО достанется СЛУЧАЙНОЕ число
любое число всегда случайное
говорить можно о последовательности
если в последовательности не наблюдается закономерности она случайная, а отдельное число с чем будешь сравнивать? какое ожидание числа?
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
21.07.2014, 17:25
Цитата Сообщение от ValeryS Посмотреть сообщение
любое число всегда случайное
говорить можно о последовательности
если в последовательности не наблюдается закономерности она случайная, а отдельное число с чем будешь сравнивать? какое ожидание числа?
повтори это 1000 раз и будет тебе РЕАЛЬНО случайная последовательность

Добавлено через 22 секунды
а лучше бесконечность раз, для точности
0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 20:02
Цитата Сообщение от Krock21rus Посмотреть сообщение
хватит спорить, вот вам правильный код:
О, еще один "находчивый" человек. Вы бы объединились с ТС в одну команду, может новый "Тупой и еще тупее"Майкрософт или Гугл получится. Может, разработаешь свой ГПСЧ? Неортодоксальные идеи из тебя так и хлещут.
А на будущее советую высказываться менее безапелляционным тоном. Просто чтобы менее смешно выглядеть, когда скажешь чушь какую-нибудь. Хотя о чем это я? Такие никогда не понимают, что сказали чушь -
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
21.07.2014, 21:22
Цитата Сообщение от Krock21rus Посмотреть сообщение
тут очень какая максимальная рандомность, т.к. там оперируется не так что эту секунду выдаёт 1, а на следующую 2, а на следующую 3, там всё намного точнее
"Тут" - это где? Что касается функции rand(), то при каждом запуске следующей программы (компилятор vs2008)

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    srand( 4829 );
    for( int i = 0; i < 10; ++i)
    {
        cout << rand() << endl;
    }
    system("pause");
 
    return 0;
}
получается одна и та же последовательность. (Как и написано в справке: "rand() returns a pseudorandom number".)

15808
7262
9178
8851
10575
1303
30647
19483
20376
29401
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2014, 21:22

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

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

Конвертирование объекта модифицированного костями для Unity.
Возникла такая ситуация. Смоделировал прямую дорогу, добавил кости и сделал кривую. Сохранил, загрузил в unity, но коллайдер для моей...

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

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru