生成R中总和为1的3个随机数

mma*_*123 11 random r

我希望创建总和为1的3个(非负)准随机数,并反复重复.

基本上我试图在许多试验中将某些东西分成三个随机部分.

虽然我知道

a = runif(3,0,1)

我想我可以在下一次运行时使用1-a作为最大值,但是看起来很麻烦.

但这些当然不能归结为一个.有任何想法,哦明智的stackoverflow-ers?

Jos*_*ien 13

这个问题涉及比最初可能显而易见的更微妙的问题.查看以下内容后,您可能需要仔细考虑使用这些数字表示的过程:

## My initial idea (and commenter Anders Gustafsson's):
## Sample 3 random numbers from [0,1], sum them, and normalize
jobFun <- function(n) {
    m <- matrix(runif(3*n,0,1), ncol=3)
    m<- sweep(m, 1, rowSums(m), FUN="/")
    m
}

## Andrie's solution. Sample 1 number from [0,1], then break upper 
## interval in two. (aka "Broken stick" distribution).
andFun <- function(n){
  x1 <- runif(n)
  x2 <- runif(n)*(1-x1)
  matrix(c(x1, x2, 1-(x1+x2)), ncol=3)
}

## ddzialak's solution (vectorized by me)
ddzFun <- function(n) {
    a <- runif(n, 0, 1)
    b <- runif(n, 0, 1)
    rand1 = pmin(a, b)
    rand2 = abs(a - b)
    rand3 = 1 - pmax(a, b)
    cbind(rand1, rand2, rand3)
}

## Simulate 10k triplets using each of the functions above
JOB <- jobFun(10000)
AND <- andFun(10000)
DDZ <- ddzFun(10000)

## Plot the distributions of values
par(mfcol=c(2,2))
hist(JOB, main="JOB")
hist(AND, main="AND")
hist(DDZ, main="DDZ")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


ddz*_*lak 10

从只是随机的2个数字(0,1),如果假设其ab,那么你得到:

rand1 = min(a, b)
rand2 = abs(a - b)
rand3 = 1 - max(a, b)
Run Code Online (Sandbox Code Playgroud)

  • 由此产生的分布似乎并非完全无关紧要:http://www.jstor.org/discover/10.2307/2983572?uid = 21299&uid = 2&uid = 70&uid = 4&sid = 21100849643501以及后来可以免费访问的论文http:// doc.utwente.nl/70657/1/Sleutel67random.pdf (3认同)

Gre*_*now 8

当您想要随机生成添加到1(或其他值)的数字时,您应该查看Dirichlet分布.

包中有一个rdirichlet函数,gtools运行RSiteSearch('Dirichlet')会带来很多点击,很容易让你找到这样的工具(对于简单的Dirichlet发行版也不难手工编写).


小智 6

我想这取决于你想要的数字分布,但这是一种方式:

diff(c(0, sort(runif(2)), 1))
Run Code Online (Sandbox Code Playgroud)

使用replicate你希望得到尽可能多套:

> x <- replicate(5, diff(c(0, sort(runif(2)), 1)))
> x
           [,1]       [,2]      [,3]      [,4]       [,5]
[1,] 0.66855903 0.01338052 0.3722026 0.4299087 0.67537181
[2,] 0.32130979 0.69666871 0.2670380 0.3359640 0.25860581
[3,] 0.01013117 0.28995078 0.3607594 0.2341273 0.06602238
> colSums(x)
[1] 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)


小智 5

我会简单地从均匀分布中随机选择 3 个数字,然后除以它们的总和:

n <- 3
x <- runif(n, 0, 1)
y <- x / sum(x)
sum(y) == 1
Run Code Online (Sandbox Code Playgroud)

n 可以是您喜欢的任何数字。