Надеюсь, я смогу это хорошо объяснить, если нет, я попробую еще раз.
Я хочу сгенерировать массив из 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 ответа
Это генерирует все возможные комбинации, которые в сумме составляют 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()
используется для выбора случайного значения из результирующего списка
Просто сгенерируйте четыре числа, используя описанную выше технику, затем вычтите сумму четырех из 10, чтобы выбрать последнее число.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.