Как я могу преобразовать числа в диапазоне от 0-1 до диапазона 1-52, используя дискретное равномерное распределение в Python?

#python #montecarlo

#python #montecarlo

Вопрос:

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

Я ценю любую помощь, которую вы можете оказать.

Комментарии:

1. Почему бы не использовать random.choice(range(1, 53)) напрямую? (вместо того, чтобы получать случайное число в (0,1) и преобразовывать его в дискретное число в [1, 52])

2. @LoMaPh Mersenne Twister, используемый Python, хорош, но не идеален; видите , нам давно пора отказаться от Mersenne Twister . Я думаю, что можно спросить, как использовать альтернативы.

3. Случайное число 0-1 с плавающей запятой или это целое число в один бит?

4. Да, Ломаф, но это почти то же самое, что я делаю с функцией random.sample, которую я использую сейчас, я имею в виду, что для этого берется выборка руки размера X из покерного списка из 52 мастей, который я генерирую.

5. @Mark Ransom числа, которые генерируют мои методы, являются псевдослучайными числами, например, 0.03245, 0.764… Итак, я думаю, с плавающей запятой

Ответ №1:

Это больше математический вопрос, чем python. вот решение:

Код:

 import random

arr_0_1 = [random.random() for i in range(10)]
print(arr_0_1)
d = 1/51
arr_1_52 = [n/d   1  for n in arr_0_1]
print(arr_1_52)
 

Вывод:

 [0.49864143060719257, 0.9124661869543931, 0.14064674065024652, 0.6162308610305717, 0.698038549502753, 0.18002207940954196, 0.7337352732415695, 0.34955525833304546, 0.6380173638897209, 0.14733996159513485]
[26.430712960966822, 47.535775534674045, 8.172983773162573, 32.42777391255916, 36.5999660246404, 10.18112604988664, 38.42049893532005, 18.82731817498532, 33.53888555837577, 8.514338041351877]
 

Комментарии:

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

Ответ №2:

Если число является числом с плавающей запятой между 0 и 1 (диапазон [0, 1)), вы можете сделать:

 int(random() * 52)
 

чтобы получить случайное int значение от 0 до 51 (диапазон [0, 51]).
Или сделать:

 int(random() * 52)   1
 

чтобы получить случайное int значение от 1 до 52 (диапазон [1, 52]).

Комментарии:

1. Если случайный диапазон [0, 1] вместо [0, 1) , вы все равно можете использовать int(random() * 52) , но проверьте, есть ли результат 52 , и отбросьте его, если он есть.

Ответ №3:

Решение

Это решение также справедливо, оно дает мне те же результаты.

Комментарии:

1. Ваше изображение — это простой текст, поэтому вы должны записать его как текст, а не публиковать его изображение.