spa*_*per 6 python random algorithm distribution
这个问题以前曾被问过,但我从未见过一个好的答案。
我想生成 8 个总和为 0.5 的随机数。
我希望每个数字都是从均匀分布中随机选择的(即,下面的简单函数将不起作用,因为数字不会均匀分布)。
def rand_constrained(n,tot):
r = [random.random() for i in range(n)]
s = sum(r)
r = [(i/s*tot) for i in r]
return r
Run Code Online (Sandbox Code Playgroud)该代码应该是可推广的,以便您可以生成 N 个均匀随机数,其总和为 M(其中 M 是正浮点数)。如果可能的话,您能否解释一下(或用图表示)为什么您的解决方案均匀地在适当的范围内生成随机数?
未达标的相关问题:
生成多个随机数以等于 python 中的值(当前接受的答案不统一 - 另一个统一的答案仅适用于整数)
获取N个随机数,总和为M(Java中的同一问题,当前接受的答案完全错误,也没有均匀分布的答案)
生成 R 中总和为 M 的 N 个随机整数(同样的问题,但在 R 中具有正态(非均匀)分布)
任何帮助是极大的赞赏。
对于完全通用的解决方案(“我想要和n之间的数字,总和为):lowhighm
from random import uniform as rand
def randConstrained(n, m, low, high):
tot = m
if not low <= 0 <= high:
raise ValueError("Cannot guarantee a solution when the input does not allow for 0s")
answer = []
for _ in range(n-1):
answer.append(low + rand(0,tot) * (high-low))
tot -= answer[-1]
answer.append(m-sum(answer))
return answer
Run Code Online (Sandbox Code Playgroud)
对于您的情况,可以按如下方式使用:
In [35]: nums = randConstrained(8, 0.5, 0, 1)
In [36]: nums
Out[36]:
[0.2502590281277123,
0.082663797709837,
0.14586995648173873,
0.011270073049224807,
0.009328970756471237,
0.00021993111786291258,
0.0001831479074098452,
0.000205094849743237]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4078 次 |
| 最近记录: |