随机数生成器(Python)



如何生成介于-1和1之间的10个随机十进制数,其中这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维物体的形状。一旦知道了它的形状,就可以从9维对象中进行采样,并在10维中应用相关的旋转。

这里有一个基于随机采样的n-单纯形的解决方案(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个。

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

最新更新