Bonjour,
La fonction suivante donne une permutation de la matrice d'origine qui satisfait les conditions des marges :
Code : Tout sélectionner
random.mat <- function(m) {
nr <- nrow(m)
nc <- ncol(m)
sr <- rowSums(m)
sc <- colSums(m)
m[,] <- 0
for (i in 1:nr) {
m[i,sc==nr-i+1] <- 1
prob=1-(sc==nr-i+1 | sc==0)
if (sum(prob)>0) m[i,sample(1:nc,sr[i]-sum(m[i,]),prob=prob)] <- 1
sc <- sc-m[i,]
}
m
}
Exemple :
Code : Tout sélectionner
m <- matrix(0,nrow=4,ncol=5)
m[sample(1:20,10)] <- 1
m
random.mat(m)
Cependant je suppose que par "emplacements aléatoires" vous sous-entendez que les matrices générées doivent être équiprobables (parmi l'ensemble des matrices répondant à la condition). Or je ne peux pas garantir que ce soit le cas de la fonction random.mat.
Néanmoins on peut vérifier simplement dans le cas particulier d une matrice carrée dont toutes les marges valent 1 que la distribution des matrices générées a l'apparence d'une distribution uniforme (en codant une matrice par les positions du '1' dans chaque ligne, par exemple diag(4) codée par "1234")
Code : Tout sélectionner
key <- function(m) paste(apply(m,1,function(x) which(x==1)),collapse='')
random.key <- function(m) key(random.mat(m))
z <- sapply(1:24000,function(i) random.key(diag(4)))
table(z)
Ce n est évidemment pas une preuve, c est seulement une présomption d équiprobabilité.