2017-04-01 2 views

Répondre

1

Si vous choisissez n nombres dans [0,1] qui somme à 1 vous êtes en effet choisir n-1 des points d'arrêt. Vous pouvez choisir les points d'arrêt puis travailler à rebours pour les chiffres:

rand.sum <- function(n){ 
    x <- sort(runif(n-1)) 
    c(x,1) - c(0,x) 
} 

Et puis

t(replicate(4,rand.sum(30))) 

sera une matrice de 4x30 de nombres aléatoires où eaxch sommes des lignes à 1.

+0

Merci beaucoup pour votre réponse. – Sharon

3

Voici une solution basée sur la transformation softmax (logit multinomial).

m <- matrix(rnorm(4 * 30), nrow=30) 
prob <- exp(m)/rowSums(exp(m)) 

rowSums(prob) 
#[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

all(prob > 0 & prob < 1) 
#[1] TRUE