随机生成总和为 1 的概率

Jok*_*312 1 r

我试图生成三个概率,它们的总和一定为 1。我尝试了以下操作:

x <- sample(seq(0.05,0.95,0.05), size=3)
x <- boom/sum(boom)
Run Code Online (Sandbox Code Playgroud)

但是,我希望生成的数字是保留两位小数的分数,即从 0.05 到 0.95 的数字,步长为 0.05(这样它们的总和也为 1)。上面的代码生成的数字的问题是它们可能有很多或无限的小数位。我怎样才能实现我所需要的?有人做过类似的事情吗?

All*_*ron 5

你可以做

diff(c(0, sort(sample(seq(0.05, 0.95, 0.05), 2)), 1))
#> [1] 0.05 0.75 0.2
Run Code Online (Sandbox Code Playgroud)

这是通过选择 0.05 到 0.95 之间的 2 个随机双位数并对它们进行排序来实现的。第一个数字是第一个样本,第二个数字是两个数字之间的距离,第三个数字是第二个数字与 1 之间的距离,因此它们必然加为 1。

请注意,如果所有数字的总和必须为 1,并且没有一个数字可以低于 0.05,则意味着没有一个数字可以是 0.95。

例如,如果我们想要十个这样的样本,我们可以这样做:

t(replicate(10, diff(c(0, sort(sample(seq(0.05, 0.95, 0.05), 2)), 1))))
#>       [,1] [,2] [,3]
#>  [1,] 0.25 0.15 0.60
#>  [2,] 0.25 0.25 0.50
#>  [3,] 0.30 0.05 0.65
#>  [4,] 0.25 0.50 0.25
#>  [5,] 0.50 0.05 0.45
#>  [6,] 0.45 0.20 0.35
#>  [7,] 0.10 0.85 0.05
#>  [8,] 0.45 0.50 0.05
#>  [9,] 0.15 0.40 0.45
#> [10,] 0.40 0.30 0.30
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2022 年 6 月 17 日创建(v2.0.1)