用Python如何实现产生一列随机浮点数,总和不超过某个数?比如,产生10个随机浮点数,总和不超过50。时间性能要尽量地好
我只知道有一种简单粗暴的方法:
import numpy as np
def get_random_number_list():
while True:
nums = np.random.uniform(0.0, 50.0, 10)
if np.sum(nums) <= 50.0:
break
return nums
但这种方法效率太低,请问大家有什么高效一点的方法吗?
可以用numpy库的pi方法实现:
(这是我之前写过的代码,旁边有注释,你把参数改一下就好啦)
运行结果如下:
因为这是个一维数组,我们得处理一下,把里面的元素提取出来,用flat属性:
为了方便操作,先将这个数组命名为b,然后element就是b里面的元素,通过for循环可print出来,如下图:(补充,end参数的作用是每个print后以什么结束,默认是换行,这里改成空格)
运行结果如下:(看第二行)
补充:最开始得import numpy as np
参考发红包算法
二倍均值法
假设剩余红包金额为m元,剩余人数为n,那么有如下公式:
每次抢到的金额= 随机区间 [0.01,m/n×2-0.01]元
这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。
下面举个例子。
假设有5个人,红包总额为100元。
100÷5×2=40,所以第1个人抢到的金额的随机范围是[0.01,39.99]元,在正常情况下,平均可以抢到20元。
假设第1个人随机抢到了20元,那么剩余金额是80元。
80÷4×2=40,所以第2个人抢到的金额的随机范围同样是[0.01,39.99]元,在正常的情况下,还是平均可以抢到20元。
假设第2个人随机抢到了20元,那么剩余金额是60元。
60÷3×2=40,所以第3个人抢到的金额的随机范围同样是[0.01,39.99]元,平均可以抢到20元。
以此类推,每一次抢到金额的随机范围的均值都是相等的。
你题目的解答代码如下:
import random
def redpacket(cash,person):
res = []
for x in range(person,1,-1):
n = random.uniform(0.0,cash/x*2)
cash-=n
res.append(n)
res.append(cash)
return res
print(redpacket(50,10))
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
要0到50,又要均匀,然后又要总和不超50,这10个数在5上下才会比较满足吧。
随便抓10个0~1的随机数,然后求出和K,然后每一个随机数都除以K乘以50 (或乘以任何一个小于50的数)