Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2011, 14:01   #1
SeventhKey
Новичок
Джуниор
 
Регистрация: 09.04.2011
Сообщений: 1
По умолчанию Random с неоднородной вероятностью выпадения событий

Доброго времени суток всем.
Пишу программу для тренировки быстрого подсчета шансов в покере.
Для этого мне нужен генератор случайных чисел, но... "случайные числа" от 6 до 13 должны выпадать чаще, чем 14..17 и 3..6 и уж тем более чаще, чем 17..22 и 1..2. Как это можно реализовать?
SeventhKey вне форума Ответить с цитированием
Старый 09.04.2011, 17:12   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

А внутри каждого из этих интервалов ([6,13],[14,17],[3,5],[1,2],[18,22])? Вероятность одинаковая? Я в покер не играю, потому и спрашиваю.
Vago вне форума Ответить с цитированием
Старый 09.04.2011, 21:54   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Просто это делается, на самом деле.
Код:
if (rand()%2 == 0)
{
... /* Вероятность 50%*/
}
Код:
if ((rand()%2 == 0) && (rand()%2 == 0))
{
... /* Вероятность 25%*/
}
И так далее.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 09.04.2011, 23:33   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

После того как 30 с лишним лет назад Форсайт, Малькольм и Моулер выставили на посмешище авторов культовой, как сейчас бы сказали, IBM-овской RANDU(), я очень осторожно отношусь к слову "просто" в применении к датчикам случайных чисел Я, для повышения эрудиции, хотел бы понять сначала - откуда в условии взялось "22"?..
Vago вне форума Ответить с цитированием
Старый 09.04.2011, 23:52   #5
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

ну, смотрите, rand%2 вернет либо 1, либо 0, следовательно, следующий ранд так же вернет либо 1, либо 0, перемножаем вероятности - получаем 25%, или 1/2 * 1/2 = 1/4 = 0.25
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 10.04.2011, 00:13   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

kaljan775, если это Ваше объяснение - для меня, то спасибо, конечно! То, что вероятность выпадения двух "орлов" после двух подбрасываний монеты равна 1/4, я знаю Но только датчик случайных чисел возвращает не вероятность! На его выходе обычно - [псевдо]случайная величина, лучше или хуже подчиняющаяся тому или иному закону распределения. Так я хотел бы понять для начала, какой закон распределения нужен ТС (который куда-то исчез, кстати)?
Vago вне форума Ответить с цитированием
Старый 10.04.2011, 00:40   #7
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Vago, просто я рассматриваю в данном случае функцию rand() как самую эффективную в получении случайных чисел (пренебрегая тем, что они - псевдослучайные). Если автору понадобится заменить ее на другую - так никто ж не против.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 10.04.2011, 01:05   #8
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Сtrl, та я ж не против использования где-то внутри Вашей ф-ии "кирпичика" под названием rand() Не знаю, насколько она "самая эффективная" - не мерял. Самая доступная - это да Но! rand() имитирует равномерное распределение. Я, прежде чем начинать думать, как делать, обычно стараюсь понять - что нужно сделать? А тут я пока не понимаю! Ладно, ТС нет, давайте пофантазируем без него. Предположим, мы решили написать датчик, генерирующий натуральные числа из интервала [1,22], распределённые по нормальному закону, со средним равным 11. Ну куда Вы, к вот этому моему двустрочному "ТЗ", я извиняюсь, прицепите свой код из #3 ?
Vago вне форума Ответить с цитированием
Старый 10.04.2011, 01:14   #9
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Vago, я показал то, каким образом можно выполнить определенный код с заданной вероятностью. Если у используемой функции получения случайных чисел распределение действительно равномерное, то код очень легко использовать.
Давайте посмотрим в задание автора:
Цитата:
6 до 13 должны выпадать чаще, чем 14..17 и 3..6 и уж тем более чаще, чем 17..22 и 1..2
Как видим, автору требуется, чтобы числа в одном диапазоне появлялись чаще, чем в другом. Для этого используем мой метод выполнения кода с определенной вероятностью, и работать это будет следующим образом:
С 50% вероятностью мы будем использовать тот же rand() уже в диапазоне [6;13] для получения числа, с 25% вероятностью в диапазонах [14;17] и [3;6], а в остальных случаях в диапазонах [1;2] и [17;22].
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 10.04.2011 в 01:17. Причина: Диапазоны подправил.
Сtrl вне форума Ответить с цитированием
Старый 10.04.2011, 01:49   #10
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Я вижу это приблизительно так:
1. Изначально нужно знать приблизительное соотношении выпадания интервалов (указывает пользователь);
2. Генерируем значения, заносим в связанных список - перемешиваем его случайным образом - и вот уже будет нечто похожее на какой-нибудь расклад.
EC.cpp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вероятность выпадения в процентах ololo-schoolboy Общие вопросы C/C++ 6 25.01.2011 20:54
вывод рандомного числа с большей или меньшей вероятностью unbanned Паскаль, Turbo Pascal, PascalABC.NET 6 19.01.2011 07:04
Алгоритмы. Работа с вероятностью. anton_kovalev Помощь студентам 2 21.01.2010 10:27
Подпрограмма определяющая вероятность выпадения счастливого билетика. Doublefaced Помощь студентам 9 05.08.2009 15:00
Делфи(Консоль) и C# - Подпрограммы(Вероятность выпадения «счастливого билетика» ) Doublefaced Помощь студентам 3 30.06.2009 22:15