如何生成三个随机数之和为1?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成三个随机数之和为1?相关的知识,希望对你有一定的参考价值。

我需要生成3个随机数,其数量等于1。

我的实现不支持统一分发。 :(

答案

只需获得3个随机数,然后计算一个因子,即1 / [您的数字之和]。最后,将每个随机数乘以该因子。总和为1。

另一答案

这实际上是一个棘手的问题。首先:Daren的解决方案不统一,因为它不支持具有两个大于1/3的数字。Simen的解决方案不是统一的,假设“从随机分布中抽取一个随机数”是一个小问题,但这会更加微妙。变量之间至少是对称的(即[a,b,c]的概率与任何排列的概率相同),但是它在很大程度上倾向于更接近(1 / 3、1 / 3、1 / 3)。通过查看极端情况来以这种方式思考:(1/3,1/3,1/3)可能来自任何(a,a,a),范围从0到1。(1,0,0),必须是有效的三元组,必须来自(1,0,0)。

[一个解决方案:加1的一组正数在三个空间中形成一个等边三角形,坐标为(1,0,0),(0,1,0),(0,0, 1)。将其扩展为平行四边形-例如通过添加一个点(1,1,-1)作为第四点。这是面积的两倍-将第二个面积映射到第一个面积,这样就足以在此平行四边形中选择一个随机点。

平行四边形可以通过(0,0,1)+ A(1,0,-1)+ B(0,1,-1)均匀采样,其中A和B的范围从0到1均匀。

-A

另一答案

生成两个介于0和1之间的随机数。将它们各除以3。第三个是1与两个随机三分之一的差:

void Main()

    Random r = new Random();
    double d1 = r.NextDouble() / 3.0;
    double d2 = r.NextDouble() / 3.0;
    double d3 = 1.0 - d1 - d2;
    System.Console.WriteLine(d1);
    System.Console.WriteLine(d2);
    System.Console.WriteLine(d3);
    System.Console.WriteLine(d1 + d2 + d3);

这将在LINQPad中输出以下内容:

0.0514050276878934
0.156857372489847
0.79173759982226
1
另一答案

Marnix的回答略有变化:

  1. 从[0,1]生成随机数a
  2. 生成两个随机数。来自[0,a]的x和来自[a,1]的y
  3. 将结果设置为xy-x1-y
另一答案

有一个简单的方法,但是您需要能够生成统一的随机数。

让X均匀地等于(0,2 / 3)。如果X <1/3,则Y = X + 1/3。否则,让Y = X-1/3。令Z = 1-X-Y。

在此设置下,X,Y和Z的总和为1,它们的边际分布都相同(0、2 / 3),并且所有三个成对的相关性均为-(1/2)。

另一答案

UPDATE

另一答案

1/2方法:

另一答案

2/2方法:

另一答案

以@Simen和@Daren Thomas的答案为基础,这是一个服务函数,该函数返回具有统一随机值的双精度列表,您可以在其中指定所需的数字,数字的总和和位数:

以上是关于如何生成三个随机数之和为1?的主要内容,如果未能解决你的问题,请参考以下文章

python随机生成一个4位整数,求各个数位上的数字之和

如何生成满足某些条件的三个随机整数? [关闭]

如何在 Python 中为截断的正态分布生成相关随机数?

python 生成10个1~1000内的随机数 十个数字之和小于5000就输出结果

php生成三个数字并且任意两个不重复

matlab如何生成对角元素为无穷大,且对称的矩阵