2012-04-12 2 views
1

Я пытаюсь создать случайное число в диапазоне от -1 до 6, но каждый раз, когда я генерирую случайное число, вероятность получение числа в диапазоне задается процентом. Например, в списке процентов первый процент имеет вероятность генерации 6, второй процент имеет вероятность генерации 5 и т. Д. Номера должны генерироваться случайным образом. Я пытаюсь закодировать это в C. Спасибо за ваши идеи.Как создать случайное число в пределах диапазона, учитывая вероятность получения одного из чисел

+0

К VTC-ers. Это на самом деле довольно распространенная вещь (противоположность слишком локализованной), хотя она описана немного запутанно. – bitmask

ответ

4

Вы можете получить случайное число от 0 до 100 и проверить, какой процентный диапазон попадает и назначить ему соответствующее значение.

Например:

0 - 5 : -1 
    5 - 25 : 0 
    25 - 31: 1 
    31 - 48: 2 
    48 - 50: 3 
    50 - 75: 4 
    75 - 87: 5 
    87 - 100: 6 

EDIT:

Для реализации этого вам потребуется один или два массива, один, который хранит процентные границы (значение 5, 25, 31, 48, 50 , 75, 87 в этом случае) и еще один массив, в котором хранятся выходные значения (если выходы полностью случайны, здесь, где они являются последовательными, вам не понадобится второй массив).
Тогда вы получите позвонить rand() * 100.0/RAND_MAX, чтобы получить случайный поплавок от 0 до 100 или rand() % 100 + 1 для случайного междунар между 0 и 100.

С этим вы можете использовать бинарный метод поиска, чтобы найти какой процент диапазона это соответствует в O (log n). С индексом вы найдете соответствующий результат (либо через массив, либо функцию)

+0

Я действительно сделал что-то вроде этого, но я учил, что делал это неправильно .. но спасибо за разъяснение этого для меня – user1319817

0

Я уверен, что есть другие, возможно, лучшие способы сделать это, но на ум приходит следующее: создать массив, содержащий соответствующие копии каждого номера (от -1 до 6) в соответствии с вашими процентами. Затем произвольно выберите элемент в массиве.

+0

Это работает, если проценты являются целыми числами, для процентов, таких как 0,5%, это не сработало – SirGuy

1

Это домашнее задание? Я не собираюсь предполагать, что ради вероисповедания в человечестве;)

Итак, я имею в виду, что все ваши проценты должны содержать до 100 прав? Вы можете сгенерировать число от 0 до 100 и посмотреть, в какую скобку он попадает.

т.е. если ваши проценты [10,20,35,15,10,10]

Тогда первая скобка "< 10" так что любое число, генерируемое при 10 yeilds 6

x < 10 --> 6 
10 <= x < (10+20) --> 5 
(10+20) <= x < (10+20+35) --> 4 
(10+20+35) <= x < (10+20+35+15) --> 3 

и т. Д. Вы хотите создать случайное значение поплавка от 1 до 100, чтобы удовлетворить процентные ставки, например 11.9.

+0

Нет, это не домашняя работа назначение;) Я просто попытался сделать простую текстовую игру. Спасибо за вход :) – user1319817

0

Я думаю, что самый простой способ сделать это, чтобы рассмотреть следующую аналогию:

Если у вас есть строка [0,1], вы можете думать, что производящее число от 1 до 4 эквивалентно расколоть строка в 4 сегментах, S_1 = [0,1/4], S_2 = [1/4,2/4], S_3 = [2/4,3/4], S_4 = [3/4,1]. Таким образом, когда вы создаете число из [0,1], если оно попадает на сегмент S_i, сгенерированное число равно i.

Если вы хотите назначить разные вероятности каждому номеру, скажем p_i, вам просто нужно разделить сегмент разных размеров, в соответствии с p_i.

Например, для 1 с p_1 = 0,1, 2 с p_2 = 0,4, 3 с p_3 = 0,2 и 4 с p_4 = 0.3 вы можете использовать сегменты S_1 = [0, p_1], S_2 = [p_1, p_1 + p_2], S_3 = [p_1 + p_2, p_1 + p_2 + p_3] и S_4 = [p_1 + p_2 + p_3, p_1 + p_2 + p_3 + p_4]

Затем вы создаете равномерное случайное число на [0,1] и проверяете, упал ли он на S_i.

+0

У вас есть хороший момент. Это очень похоже на мое решение, но диапазон может быть действительно любым диапазоном, который вы хотите использовать. Я полагаю, если коэффициенты верны. Диапазон значений между 0 и 1 хорош, если ваши проценты и генератор случайных чисел уже находятся в этом диапазоне. – mltsy

1

Сделать массив, чтобы иметь 100 элементов, заполнить его -1 до 6, в зависимости от того, сколько веса каждый нуждается. например, если вам нужно -1, чтобы получить 15% -ный удар, вы заполняете 15 элементов с -1. теперь генерируют случайное число от 1 до 100 и просто просматривают массив, вы получаете взвешенные результаты.

+0

, который не работает для десятичных процентов, например, 0,5% – SirGuy

+0

, так как он делает текстовую базовую игру, я думаю, что целочисленный процент достаточен, если он не говорит иначе. Это также должно обеспечить хорошую производительность для высокочастотного использования. – pizza

+0

Согласен, я не имел в виду, что ваш метод был недействительным, просто есть оговорка – SirGuy

Смежные вопросы