这个问题以前也有人问过,但我从来没有真正看到过好的答案。
>
我想生成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
代码应该是可推广的,这样您就可以生成N个和M(其中M是正浮点)的均匀随机数。如果可能的话,能否也请你解释一下(或用一个图表示)为什么你的解会在适当的范围内均匀地产生随机数?
失手的相关问题:
在python中生成多个随机数以等于一个值(当前接受的答案不统一--另一个统一的答案只适用于整数)
得到N个和为M的随机数(Java中同样的问题,目前接受的答案只是明显错误,也没有均匀分布的答案)
你所要求的似乎是不可能的。
不过,我会重新解读你的问题,让它更有意义,更有可能解决。你需要的是一个七维超平面上的概率分布<代码>x_1+x_2+...+x_8=0.5。由于超平面的范围是无限大的,所以在整个超平面上的均匀分布是行不通的。你大概(?)want是超平面中所有x_i>0
的块。那个区域是一个单纯形,是三角形的推广,在单纯形上的均匀分布是Dirichlet分布的特例。
您可能会发现Dirichlet分发版维基百科文章string cutting的这一节特别具有启发性。
params = [a1, a2, ..., ak]
sample = [random.gammavariate(a,1) for a in params]
sample = [v/sum(sample) for v in sample]
感谢Severin Pappadeux指出gammavariate可以在罕见的情况下返回无穷大。这在数学上是“不可能的”,但可以作为浮点数实现的工件发生。我对处理那个案例的建议是在sample
第一次计算出来之后再检查;如果sample
的任一分量是无穷大,则将所有非无穷大分量设置为0,将所有无穷大分量设置为1。然后,当计算xi
时,将产生类似xi=1,所有其他x's=0
或xi=1/2,xj=1/2,所有其他x's=0
的结果,统称为“角样本”和“边缘样本”。
另一种极低概率的可能性是gammavariates的和溢出。我想我们可以遍历整个底层伪随机数序列,而不会看到这种情况发生,但理论上是有可能的(取决于底层伪随机数生成器)。这种情况可以通过重新缩放sample
来处理,例如,在gammavariates已经计算之后但在计算x之前,将sample
的所有元素除以n
。就我个人而言,我不会麻烦,因为几率是如此之低;由于其他原因导致的程序崩溃的概率会更高。
问题内容: 您能告诉我任何生成非均匀随机数的方法吗? 我正在使用Java,但是代码示例可以随心所欲。 一种方法是通过将两个统一的随机数加在一起(即滚动2个骰子)来创建歪斜分布。 问题答案: 您想要什么分布的偏差? 这是一种始终有效的技术,但并不总是最有效的。累积扰动函数P(x)给出值低于x的时间的分数。因此,在x的最小可能值处P(x)= 0,在x的最大可能值处P(x)= 1。每个分布都有一个唯一的
我知道有人问过类似的问题,比如 从包含n个元素的向量中随机选择m个元素 从未知长度的序列中随机选择N个项目 但我越看越困惑。 从N个元素中均匀随机地选择M个元素 所以我需要从N个元素中选择M个元素。我还需要使被选中的概率均匀分布于每个元素: 我的直觉是 随机选择一个元素 把它拿出来 对其余元素重复此过程 我猜这个解决方案错了?所选元素的概率为,<代码>1/(N-M),而不是,对吗? 一个可能的正确
我试图找到一种有效的算法来生成一个给定节点数的简单连通图。类似于:
问题内容: 我知道如果我使用Java的Random生成器,并使用nextInt生成数字,则数字将均匀分布。但是,如果我使用2个Random实例,并使用两个Random类生成数字,会发生什么。数字是否会均匀分布? 问题答案: 每个实例生成的数字将均匀分布,因此,如果将两个实例生成的随机数序列组合在一起,则它们也应均匀分布。 请注意,即使结果分布是均匀的,您也可能要注意种子,以避免两个生成器的输出之间
如何在一定范围内生成安全的统一随机数?范围可能在0到100之间。(上限不是2的幂)。 <代码>java。安全SecureRandom似乎提供了范围0。。2^n。
问题内容: 我试图识别/创建一个函数(在Java中),该函数给我一个非均匀的分布式数字序列。如果我有一个函数说它将给我一个从到的随机数。 该函数最适合任何给定的函数,下面仅是我想要的示例。 但是,如果我们说函数将返回来自分布式的s nonuni。 我想例如说 约占所有案件的20%。 大约是所有情况的50%。 约占所有案件的20%。 大约是所有情况的10。 总之somting,给我一个数字,如正态分