我正在寻找算法或建议来改进我的代码,以生成其总和等于任意数的随机数列表。在下面的代码中,由于第一个数字往往会更高,因此总是会有偏差。
有没有一种方法可以使数字选择更加有效?
#!/usr/bin/python
'''
Generate a list of 'numbs' positive random numbers whose sum = 'limit_sum'
'''
import random
def gen_list(numbs, limit_sum):
my_sum = []
for index in range(0, numbs):
if index == numbs - 1:
my_sum.append(limit_sum - sum(my_sum))
else:
my_sum.append(random.uniform(0, limit_sum - sum(my_sum)))
return my_sum
#test
import pprint
pprint.pprint(gen_list(5, 20))
pprint.pprint(gen_list(10, 200))
pprint.pprint(gen_list(0, 30))
pprint.pprint(gen_list(1, 10))
输出
## output
[0.10845093828525609,
16.324799712999706,
0.08200162072303821,
3.4534885160590041,
0.031259211932997744]
[133.19609626532952,
47.464880208741029,
8.556082341110228,
5.7817325913462323,
4.6342577008233716,
0.22532341156764768,
0.0027495225618908918,
0.064738336208217895,
0.028888697891734455,
0.045250924420116689]
[]
[10]
好吧,假设要求是生成长度为N的随机向量,该向量 均匀地分布 在允许的空间内,我们将解决该问题,具体如下:
给定
生成长度为N的随机向量V,以使随机变量V在其允许空间内均匀分布。
我们可以通过注意到可以计算V = U * S来简化问题,其中U是具有所需总和1的相似随机向量,并且允许范围[0,b]在其中b = B / S。值b必须在1
/ N和1之间。
首先考虑N =3。允许值{U}的空间是垂直于矢量[1 1 1]的平面的一部分,该平面穿过点[1/3 1/3
1/3],位于矢量的内部。分量在0到b之间的多维数据集。这组点{U}的形状像六边形。
(TBD:图片。我现在无法生成一个图像,我需要访问MATLAB或另一个可以进行3D绘图的程序。我无法安装Octave。)
最好使用一个向量= [1 1 1] / sqrt(3)的正交加权矩阵W(请参阅我的其他答案)。一种这样的矩阵是
octave-3.2.3:1> A=1/sqrt(3)
A = 0.57735
octave-3.2.3:2> K=1/sqrt(3)/(sqrt(3)-1)
K = 0.78868
octave-3.2.3:3> W = [A A A; A 1-K -K; A -K 1-K]
W =
0.57735 0.57735 0.57735
0.57735 0.21132 -0.78868
0.57735 -0.78868 0.21132
再次是正交的(W * W = I)
如果考虑立方体[0 0 b],[0 bb],[0 b 0],[bb 0],[b 0 0]和[b 0 b]的点,它们形成一个六边形并且都是a b * sqrt(2/3)与立方体对角线的距离。这些不能满足所讨论的问题,但是在一分钟内很有用。另外两个点[0 0 0]和[bbb]在立方体的对角线上。
正交加权矩阵W允许我们生成在{U}内均匀分布的点,这是因为正交矩阵是旋转/反射且不缩放或不倾斜的坐标变换。
我们将生成在W的3个向量定义的坐标系中均匀分布的点。第一个分量是立方体对角线的轴。U分量的总和完全取决于此轴,而不完全取决于其他轴。因此,沿该轴的坐标被强制为1
/ sqrt(3),它对应于点[1 / 3、1 / 3、1 / 3]。
其他两个分量的方向垂直于立方体的对角线。由于距对角线的最大距离为b * sqrt(2/3),因此我们将在-b * sqrt(2/3)和+ b * sqrt(2/3)之间生成均匀分布的数字(u,v)。
这给了我们一个随机变量U’= [1 / sqrt(3)uv]。然后,我们计算U =
U’*W。某些结果点将超出允许范围(U的每个分量必须在0到b之间),在这种情况下,我们将拒绝并重新开始。
换一种说法:
对于更高的尺寸(在与超立方体的主对角线垂直的超平面的一部分内均匀分布的点),解决方案相似:
预先计算等级N的加权矩阵W。
范围k(N)是N的函数,N表示侧面1的超立方体的顶点与其主对角线之间的最大距离。我不确定通用公式,但是对于N = 3是sqrt(2/3),对于N =
5是sqrt(6/5),可能在某个地方有一个公式。
问题内容: 我有以下方法。方法rnd返回两个边界之间的单个随机整数: 如何修改此值,以使返回的数字mod2 = 0? 谢谢 问题答案: 如果您可以获得范围内的随机数,那么您要做的就是获得范围内的随机数并将其乘以2以得到范围内的随机偶数
本文向大家介绍JavaScript返回0-1之间随机数的方法,包括了JavaScript返回0-1之间随机数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript返回0-1之间随机数的方法。分享给大家供大家参考。具体如下: JavaScript的Math对象的random方法可以返回一个0-1之间随机数 希望本文所述对大家的javascript程序设计有所帮助。
问题内容: 在Java中,如何生成随机数,但如何使该随机数偏向特定数字。例如,我想生成一个介于1到100之间的数字,但是我希望该数字偏向75。但是我仍然希望能够获得该范围内的其他数字,但是我希望获得数字的更多变化接近75,而不是仅仅获得整个范围内的随机数。谢谢 问题答案: 尝试http://download.oracle.com/javase/6/docs/api/java/util/Random
这个问题以前也有人问过,但我从来没有真正看到过好的答案。 > 我想生成8个和为0.5的随机数。 我希望每个数字都是从一个均匀分布中随机选择的(即下面的简单函数将不起作用,因为数字将不是均匀分布的)。 代码应该是可推广的,这样您就可以生成N个和M(其中M是正浮点)的均匀随机数。如果可能的话,能否也请你解释一下(或用一个图表示)为什么你的解会在适当的范围内均匀地产生随机数? 失手的相关问题: 在pyt
我必须编写一个程序,其中方法返回读取的正数之和,并将从用户那里读取输入,直到输入零。 到目前为止,我没有计算正数的总和,我需要一些帮助,请。 以下是我目前掌握的情况: (请注意,您得到了扫描程序,不要使用system.in)-从用户读取,直到给定0,并返回读取的正数的和。 示例: ♦用户输入:0=>返回0 ♦用户输入1 2 3 0=>返回6(1+2+3) ♦用户输入1-2 3 0=>返回6(1+3
我有以下规格: 写一个函数,给出一个非负整数列表,将它们排列成可能的最大数。例如,给定[50,2,1,9],最大形成数为95021。 我曾尝试过解决这个问题,但失败了。例如,给定输入[90,91,89,999],此代码的结果是[909199989],但它应该是[999919089]。 简单地说,它是基数排序的倒数。 步骤 1)根据值创建桶。 2)每个桶都有元素列表。 3)对每个桶中的列表进行排序。