如何产生一列随机浮点数,总和不超过某个数?

用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方法实现:
(这是我之前写过的代码,旁边有注释,你把参数改一下就好啦)

img

运行结果如下:

img

因为这是个一维数组,我们得处理一下,把里面的元素提取出来,用flat属性:
为了方便操作,先将这个数组命名为b,然后element就是b里面的元素,通过for循环可print出来,如下图:(补充,end参数的作用是每个print后以什么结束,默认是换行,这里改成空格)

img

运行结果如下:(看第二行)

img

补充:最开始得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))

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

要0到50,又要均匀,然后又要总和不超50,这10个数在5上下才会比较满足吧。

随便抓10个0~1的随机数,然后求出和K,然后每一个随机数都除以K乘以50 (或乘以任何一个小于50的数)