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

问题描述 投票:12回答:9

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

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

c# random distribution uniform
9个回答
25
投票

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


10
投票

这实际上是一个棘手的问题。首先: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


3
投票

生成两个介于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

1
投票

Marnix的回答略有变化:

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

1
投票

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

让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)。


0
投票

UPDATE


0
投票

1/2方法:


0
投票

2/2方法:


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.