我希望创建总和为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),如果假设其a和b,那么你得到:
rand1 = min(a, b)
rand2 = abs(a - b)
rand3 = 1 - max(a, b)
Run Code Online (Sandbox Code Playgroud)
当您想要随机生成添加到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 可以是您喜欢的任何数字。
| 归档时间: |
|
| 查看次数: |
6771 次 |
| 最近记录: |