Генерация случайного списка целых чисел на основе распределения - PullRequest
1 голос
/ 19 августа 2010

Я надеюсь, что смогу объяснить это хорошо, если я не попробую еще раз.

Я хочу сгенерировать массив из 5 случайных чисел, которые в сумме составляют до 10, но распределение которых выбирается с интервалом [0,2n / m].

Я использую NumPy.

Код, который у меня есть, выглядит следующим образом:

import numpy as np

n=10
m=5
#interval that numbers are generated on
randNumbers= np.random.uniform(0,np.divide(np.multiply(2.0,n),fronts),fronts)
#Here I normalize the random numbers
normNumbers = np.divide(randNumbers,np.sum(randNumbers))
#Next I multiply the normalized numbers by n
newList = np.multiply(normNumbers,n)
#Round the numbers two whole numbers
finalList = np.around(newList)

Это работает по большей части, однако округление выключено, оно добавит до 9 или 11 вместо 10. Есть ли способ сделать то, что я пытаюсь сделать, не беспокоясь об ошибках округления, или, возможно способ обойти их? Если вы хотите, чтобы я был более ясным, я могу, потому что мне трудно объяснить, что я пытаюсь сделать с этим во время разговора:).

Ответы [ 2 ]

1 голос
/ 19 августа 2010

Генерирует все возможные комбинации, которые в сумме равны 10, и выбирает случайную комбинацию

from itertools import product
from random import choice
n=10
m=5
finalList = choice([x for x in product(*[range(2*n/m+1)]*m) if sum(x) == 10])

Возможно, существует более эффективный способ, но при этом справедливо выбирается результат

ПозволяетПосмотрите, как это работает, когда n = 10 и m = 5

2*n/m+1 = 5, поэтому выражение становится

finalList = choice([x for x in product(*[range(5)]*5) if sum(x) == 10])

`* [range (5)] * 5 использует распаковку аргумента.Это эквивалентно

finalList = choice([x for x in product(range(5),range(5),range(5),range(5),range(5)) if sum(x) == 10])

product() дает декартово произведение параметров, которое в этом случае имеет 5 ** 5 элементов, но затем мы отфильтровываем те, которые не добавляют к 10,который оставляет список из 381 значений

choice() используется для выбора случайного значения из результирующего списка

1 голос
/ 19 августа 2010

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

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