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

Я хочу сгенерировать массив из 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. Есть ли способ сделать то, что я пытаюсь сделать, не беспокоясь об ошибках округления, или, возможно, способ работать вокруг них? Если вы хотите, чтобы я был более ясным, я могу, потому что мне сложно объяснить, что я пытаюсь с этим сделать, когда говорю :).

1
elais 19 Авг 2010 в 07:50

2 ответа

Лучший ответ

Это генерирует все возможные комбинации, которые в сумме составляют 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
John La Rooy 25 Авг 2010 в 03:57

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

1
Kaelin Colclasure 19 Авг 2010 в 04:05