случайный двоичный список Python, равномерно распределенный - PullRequest
0 голосов
/ 30 мая 2018

У меня есть код для создания бинарного списка любой длины, с произвольным числом битов:

rand_binary_list = lambda n: [random.randint(0,1) for b in range(1,n+1)]
rand_binary_list(10)

, это возвращает что-то вроде этого:

[0,1,1,0,1,0,1,0,0,0]

и если вы запустите его миллион раз, вы получите распределение кривой колокола, где примерно sum(rand_binary_list(10)) примерно на 5 намного чаще, чем 1 или 10.

Что бы я предпочелзаключается в том, что включение 1 бита из 10 столь же вероятно, как и включение половины из них.Количество включенных битов должно быть равномерно распределено.

Я не уверен, как это можно сделать без ущерба для целостности случайности.Любые идеи?

РЕДАКТИРОВАТЬ:

Я хотел бы показать это явление кривой колокола в явном виде, так что вот оно:

>>> import random
>>> rand_binary_list = lambda n: [random.randint(0,1) for b in range(1,n+1)]
>>> counts = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0}
>>> for i in range(10000):
...     x = sum(rand_binary_list(10))
...     counts[x] = counts[x] + 1
...
>>> counts[0]
7
>>> counts[1]
89
>>> counts[2]
454
>>> counts[3]
1217
>>> counts[4]
2017
>>> counts[5]
2465
>>> counts[6]
1995
>>> counts[7]
1183
>>> counts[8]
460
>>> counts[9]
107
>>> counts[10]
6

посмотреть, как шансы получить 5 включенынамного выше шансов получить 1 бит включенным?

1 Ответ

0 голосов
/ 30 мая 2018

Примерно так:

def randbitlist(n=10):
    n_on = random.randint(0, n)
    n_off = n - n_on
    result = [1]*n_on + [0]*n_off
    random.shuffle(result)
    return result

Количество битов «вкл» должно быть равномерно распределено в [0, n] включительно, и тогда выбранные биты будут равномерно распределены по всему списку.

...