已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
昨天关门了。
Improve this question
使用R,如何生成n
随机数x_1
,...,x_n
,它们位于-1
和1
之间,并且总和为0
?
推广到另一个和和另一个范围又是什么呢?
已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
昨天关门了。
Improve this question
使用R,如何生成n
随机数x_1
,...,x_n
,它们位于-1
和1
之间,并且总和为0
?
推广到另一个和和另一个范围又是什么呢?
6条答案
按热度按时间ebdffaop1#
第一个问题的简单解决方案
下面是第一个问题的简单解决方案。在
-1
和1
之间模拟u_1
,...,u_n
。然后设置x_1 = (u_1-u_n)/2
,x_2 = (u_2-u_1)/2
,x_3 = (u_3-u_2)/2
,...,x_n = (u_n-u_{n-1})/2
。泛化为任意和
现在,如何生成
n
随机数x_1
,...,x_n
,它们位于-1
和1
之间,并且总和为给定的数字s
(在-n
和n
之间)?如前所述进行,但将
u_i
减去s/n
,并将s/n
添加到x_i
:泛化到任意范围?
现在,如何生成
n
随机数x_1
,...,x_n
,它们位于两个给定的数字a
和b
之间,并且总和为给定的数字s
(在n*a
和n*b
之间)?前面的方法可以推广到**
a = -b
**的情况:最后是DRS算法
Dirichlet-rescale algorithm解决了任意一对数字
a < b
的最后一个问题。此外,模拟向量
(x_1, ..., x_n)
在(n-1)
维流形{sum x_i = s}
,a <= x_i <= b
上具有***均匀分布***。这是一个R实现,改编自Roger斯塔福德编写的Matlab实现(代码中给出了参考)。
示例:
编辑
有什么不对的:这不是DRS -请参阅给定链接中的幻灯片。DRS更一般地允许
x_i
的不同边界。编辑
我刚刚发现这个方法是在R包Surrogate中实现的。
nwlqm0z12#
***首先,我想说,下面的方法只是约束随机性的可能实现,但对于均匀分布属性或类似的东西来说并不安全。
遵循递归的思想,我们可以首先生成具有更多边界约束的
r
,这可能会加快很多速度,并且***效率更高***我们可以看到
一种蛮力(低效)但懒惰的方法是拒绝抽样
使得
ej83mcc03#
Roger斯塔福德的算法不处理不相同的边界,因为它巧妙地利用了相同边界情况的对称性,以便在最坏的情况下有效地进行采样。
Dirichlet-Rescale(DRS)算法处理的是不同的边界,但本质上是生成-测试(在最坏的情况下效率不高),它有一个技巧:当我们在∑xi = s下采样xi ∈ [ai,bi]时,我们可以
如果Σ(ai + bi)/2〈s,则第一选项更好,并且如果Σ(ai + bi)/2〉s,则第二选项更好(原始DRS呈现要复杂得多)。
DRS的另一个特性是它努力不消耗比它需要的更多的随机性,但在我看来这是一个错误,因为对于多次迭代样本来说可能会有奇怪的浮点效应,而随机数并没有那么昂贵。
在(测试不佳)R中:
gpfsuwkq4#
这是一个基于狄利克雷采样的解决方案。
创建于2023-03-24使用reprex v2.0.2
c3frrgcw5#
这里有一个简单的方法。
下面是Ruby代码来实现这一点。下面代码中的mult处理拉伸。我使用的拉伸因子旨在保留极值点和范围之间的两个距离中更保守的一个,在加倍因子之后(考虑到范围加倍)
样品结果:
swvgeqrz6#
取所有数字的和。计算平均值。从每个数字中减去平均值。除以新的最大绝对值。现在您有一个新的随机分布,其平均值为0.0,其值在[-1.0,1.0]中。