Как создать очень равномерное случайное число в Python? - PullRequest
1 голос
/ 28 августа 2011

В какой-то степени мне нужна случайная функция, которая может генерировать очень однородные числа, например, когда я говорю [5,5], и я запускаю эту функцию 10 раз, я хотел бы иметь 5 чисел, которые меньше 0,5 и другие 5 чисел больше 0,5.

Каждый прогон должен быть отделен, как:

for i in range(0,10):
   rnd=random_function([6,3,1])
   print rnd

После десятикратного запуска этой функции у меня 6 чисел меньше 0,6, 3 числа от 0,6 до 0,9 и 1 число от 0,9 до 1.

Кто-нибудь знает, как я могу это сделать? Потому что случайная функция внутри Python не такая равномерная .... Спасибо !!

Ответы [ 4 ]

5 голосов
/ 28 августа 2011

Разве это не суть случайности, что она не однородна?Если вы хотите сгенерировать 6 случайных чисел и хотите, чтобы половина из них была меньше 0,5, а другая половина была больше 0,5, вам нужно сгенерировать 3 числа от 0 до 0,5 и 3 от 0,5 до 1.

2 голосов
/ 28 августа 2011

То, что вы просите, это не случайно;действительно, это довольно структурировано.Смысл случайных данных в том, что они не структурированы: вы не можете ничего сказать о том, какими будут значения, только то, что они будут в среднем .

Вы все еще можете сделатьто, что вы хотите: просто укажите диапазоны, в которые должны попадать ваши числа.

>>> def random_function(*args):
...     n = sum(args)
...     bottom = 0
...     for m in args:
...             for _ in range(m):
...                     yield random.uniform(bottom, bottom + m/n)
...             bottom += m/n
...
>>> list(random_function(6,3,1))
[0.1849778317803791, 0.2779140519434712, 0.08380168147928498, 0.5477412922676888
, 0.5158697440011519, 0.5535466918038039, 0.8046993690361345, 0.714614514522802,
 0.7102988180048052, 0.9608096335125095]
>>> list(random_function(6,3,1))
[0.29313403848522546, 0.5543469551407342, 0.14208842652528347, 0.344464024804118
7, 0.3168266508239002, 0.5956620829410604, 0.673021479097414, 0.7141779120687652
, 0.7783099010964684, 0.9103924993423906]

Объяснение:

Учитывая (6,3,1), определите их сумму (10).Нам нужны шесть чисел от 0 до 6/10, три числа от 6/10 до 6/10 + 3/10 и одно число от 6/10 + 3/10 до 6/10 + 3/10 + 1/10.Мы можем сгенерировать их, позвонив

random.uniform(0, 6/10) six times,
random.uniform(6/10, 9/10) three times, and
random.uniform(9/10, 1) once.
1 голос
/ 28 апреля 2015

Было бы полезно узнать контекст вашего вопроса, но, похоже, вы ищете последовательность с малым расхождением с, а не обычные псевдослучайные числа.

Более конкретно, проверьте, дает ли последовательность Halton желаемые результаты.Доступна реализация Python .

1 голос
/ 28 августа 2011

Что ж, это своего рода поражение цели "случайных" чисел, но Python поддерживает это.

Как часть модуля random (import random), вы можете использовать random.uniform(a,b)от random.random() где a до b - диапазон с плавающей запятой.

Дополнительная информация в Документация Python .

...