假设我有一个值列表,例如:
limits = [10, 6, 3, 5, 1]
对于limits
中的每一项,我需要生成一个小于或等于该项的随机数,但是,新随机列表中元素的总和必须等于指定的总和。
例如,如果total = 10
,则一个可能的随机列表是:
random_list = [2, 1, 3, 4, 0]
其中random_list
与limits
的长度相同,random_list
中的每个元素都小于或等于limits
和sum(random_list) = total
中的对应元素。
如何生成这样一个列表?我是开放的(和更喜欢)使用numpy,scipy,或Pandas。
2条答案
按热度按时间v09wglhw1#
要生成这样的列表,可以使用numpy的random.multinomial函数。该函数允许您生成一个随机数列表,这些随机数的总和为指定的总和,其中每个数字都是从指定大小的不同bin中选择的。
例如,若要产生5个总和为10的随机数清单,其中第一个数字可以是0到10之间的任何整数,第二个数字可以是0到6之间的任何整数,依此类推,您可以使用下列程式码:
这将生成一个5个随机数的列表,这些随机数之和为10,并且小于或等于限值列表中的相应元素。
或者,可以使用numpy的random.randint函数生成小于或等于limits列表中相应元素的随机数,然后使用循环将这些数字相加,直到总和等于指定的总和。
这两种方法都可以生成一个随机数列表,这些随机数的总和达到指定的总和,并且小于或等于极限列表中的相应元素。
编辑@gerges
要生成一个随机数列表,这些随机数的总和为指定的总和,并且小于或等于极限列表中的相应元素,可以使用numpy函数random.multinomial和random. randint的组合。
下面是一个示例,说明如何执行此操作:
此方法使用多项式函数生成一个随机数列表,然后使用randint函数确保每个数字都小于或等于相应的限制。这保证了生成的数字列表的总和将等于指定的总和,并且将小于或等于限制列表中的相应元素。
2uluyalo2#
找到了我要找的东西:hypergeometric distribution类似于二项式,但没有替换。
分布available in numpy:
此外,为了确保我没有误解分布,我对1000万个样本进行了合理性检查,并检查最大值是否始终在限制范围内
其与
limits
相同。