前情提要
使用numpy.random.choice()
的时候,通过参数p(一个列表)来指定所给选择元素的选择概率。但参数p(选择概率)要保证和为1,这时我又想随机生成选择概率,所以现在的问题就是怎么将1拆分成多个和为1的浮点数。
这个问题但凡读过小学都应该知道怎么解决,但问题是我是个大学生(手动狗头)。
如何解决
例如,现在要将1拆分成8个随机浮点数
- 先随机生成8个整数,例如:2,3,5,6,7,8,2,5
- 求这8个整数之和sum,即:38
- 再用1来乘各个比例,这里没有必要,但是其他数字的拆分就有必要。
例如,要将100拆分成5个随机数
- 随即生成5个整数,例如:1,1,2,3,3
- 和为10
- 拆分结果为:100*(1/10) = 10, 100*(2/10) = 20, 100*(3/10) = 30,10+10+20+30+30=100
代码
import numpy as np
from random import randint
def func(split_num):
rand_ls = [randint(0, 10) for _ in range(split_num)]
rand_sum = sum(rand_ls)
p = list(map(lambda i: i/rand_sum, rand_ls))
return p
choice_ls = [1, 2, 3, 4, 5, 6, 7, 8]
x = np.random.choice(choice_ls, replace=True, p=func(len(choice_ls)))
若p和不为1,则报错如下: