繁体   English   中英

随机数生成器 (Python)

[英]Random Number Generator (Python)

如何生成 10 个介于 -1 和 1 之间的随机十进制数,并且这 10 个数字之和为 1? (在 Python 代码中)从技术上讲,标准集不是随机的,而是如何使其尽可能随机。

创建一个 for 循环,将每个生成的数字相加。 在 for 循环的最后使用 if 语句检查总数是否等于 1,如果不等于 1 则重新生成 10 个随机数并重复该过程。 但是,如果您正在寻找一种立即执行此过程的方法,我不建议您这样做,因为生成的数字是随机的,这可能需要一段时间。

嗯,两种方法:

  • 简单但有点蛮力:在 -1 到 1 范围内生成 9 个变量(根据需要使用randomsecrets ); 计算第 10 个,所以总数是 1; 重复整个过程,直到第 10 个变量在 -1 到 1 的范围内。

    这将相对较快,因为前 9 个变量的总和必须在 -9 到 9 的范围内,并且您需要它在 0 到 2 的范围内才能获得有效变量 10。少数十几个迭代应该做到这一点。

  • 在纸上计算出您正在从中采样的 10 维空间中的 9 维 object 的形状。 一旦知道它的形状,就可以从 9 维 object 中采样,并在 10 维中应用相关旋转。

这是一个基于随机采样 n-simplex ( https://cs.stackexchange.com/questions/3227/uniform-sampling-from-a-simplex ) 的解决方案:

def sample(n=10):
    L = sorted([0, *(random.uniform(0,1) for _ in range(n-1)), 1])
    return [2*(1/n-(b-a)) + 1/n for a,b in zip(L[:-1], L[1:])]

它有时会产生超出 (-1,1) 范围的样本。 幸运的是,对于 n=10,需要拒绝的样本率约为每 10k 个样本中有 10 个。

还要记住,这是分布在一个单纯形(三角形、四面体等)上,因此它不会在各个变量中均匀分布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM