如何生成三个随机数之和为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的回答略有变化:
- 从[0,1]生成随机数
a
- 生成两个随机数。来自[0,a]的
x
和来自[a,1]的y
- 将结果设置为
x
,y-x
,1-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?的主要内容,如果未能解决你的问题,请参考以下文章