ca34 a écrit:Bonjour.
Dans Maple (12), j'ai trouvé de quoi générer des permutations aléatoires de l'intervalle d'entiers [1..n] avec randperm ou de quoi générer des combinaisons aléatoires de l'intervalle d'entiers [1..n] avec randcomb.
Mais j'aimerais générer des arrangements aléatoires (en tenant compte de l'ordre). Par exemple, pour créer un arrangement de 2 éléments parmi [1..5], tout ce que j'ai trouvé, c'est générer une permutation et prendre les 2 premiers éléments:
[op(1 .. 2, randperm(5))]
ou générer une combinaison puis prendre une permutation:
randperm([op(randcomb(5, 2))])
Mais comme je fais des simulations avec des millions de tests, je trouve que ces deux solutions sont beaucoup moins efficaces que de générer directement un arrangement. Comment fait-on avec Maple ? Merci.
ca34 a écrit:Bonjour.
Je ne pense pas que cette méthode marche dans mon cas car ce sont des arrangements sans répétition, donc les éléments doivent être distincts.
Merci quand même. :lol3:
restart;
randarr2:=proc(n,k)
local L,A,i,j:
L:=[seq(i,i=1..n)]:
A:=[]:
for i from 1 to k do
j:=rand(1..n+1-i)():
A:=[op(A),L[j]]:
L := subsop(j=NULL,L):
end do:randperm(n)[1 .. k]L:=[seq(i,i=1..n)]: A:=[]:for i from 1 to k do j:=rand(1..n+1-i)():A:=[op(A),L[j]]:L := subsop(j=NULL,L):restart;
randarr2 := proc (n, k)
local A, i, j, tampon;
global L;
A := [];
for i from 1 to k do
j := (rand(1 .. n+1-i))();
A := [op(A), L[j]];
if j n+1-i then
tampon := L[j];
L[j] := L[n+1-i];
L[n+1-i] := tampon
end if
end do;
A end proc;temps := time();
L := [seq(i, i = 1 .. 10)];
for k from 1 to 1000000 do
A := randarr2(10, 5)
end do;
time()-tempsrandperm(10)[1..5]J'ai aussi essayé de remplacer la liste A par une pile (stack dans Maple): résultat: le temps est allongé.
Quant à générer des tableaux de taille peu élevée qui contiennent des entiers aléatoires, entre 1 et n+1-i pour i=1 à k, je me demande si ça simule bien l'équiprobabilité sur une boucle de 1000000?
ca34 a écrit:OK pour A et L.
Comme tu le dis, je crois qu'il ne faut pas considérer Maple comme un langage classique (C, C++, Java...) pour ce genre d'optimisation: on ne sait pas trop comment c'est géré. :mur:
Ce qui m'étonne le plus, c'est que Maple ne prévoie pas ce qu'il faut pour générer des arrangements aléatoires, alors que ça existe pour les combinaisons et les permutations, et que c'est plutôt efficace.
randperm(randcomb(10, 5)randperm(10)[1..5]ca34 a écrit:Oui j'ai aussi testé cette possibilité:
- Code: Tout sélectionner
randperm(randcomb(10, 5)
qui est nettement moins efficace que:
- Code: Tout sélectionner
randperm(10)[1..5]
Pour une boucle de 1000000 d'arrangements aléatoires, j'obtiens sur ma configuration environ 104s pour la deuxième méthode contre 157s pour la première.
De toute façon, générer une combinaison puis lui appliquer une permutation est beaucoup moins efficace que de générer un arrangement directement: c'est une fonction qui semble manquer chez Maple.
ca34 a écrit:En fait, je me demande si tu ne confonds pas arrangements et nombre d'arrangements?
On a bien le nombre d'arrangements de m éléments parmi nqui est égal au produit
.
Mais écrire randperm(m)randcomb(n,m) n'a aucun sens car randperm(m) est une permutation de m éléments, donc ici c'est une liste. Même remarque pour randcomb(n,m) qui est un ensemble. :lol3:
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :