Question

Quelle est la meilleure façon de retourner un tableau dans un ordre aléatoire en Ruby? Tout ce qui est agréable et courte qui peut être utilisé dans une session de la CISR comme

[1,2,3,4,5].random()
# or 
random_sort([1,2,3,4,5])
Était-ce utile?

La solution

Si vous n'avez pas [] .shuffle, [] .sort_by {} rand fonctionne comme sur pointé par sepp2k. .sort_by remplace temporairement chaque élément par quelque chose dans le but de trier, dans ce cas, un nombre aléatoire.

[]. {Sorte rand-0,5} cependant, ne sera pas correctement aléatoire. Certaines langues (par exemple certains Javascript implémentations) ne brouillent pas correctement des tableaux si vous faites un tri aléatoire sur le tableau, avec des conséquences parfois assez publiques.

JS Analyse (avec des graphiques!): http: //www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html

Ruby est pas différent! Il a le même problème. :)

#sort a bunch of small arrays by rand-0.5
a=[]
100000.times{a <<  [0,1,2,3,4].sort{rand-0.5}}

#count how many times each number occurs in each position
b=[]
a.each do |x|
    x.each_index do |i|
        b[i] ||=[]
        b[i][x[i]] ||= 0
        b[i][x[i]] += 1
    end
end
p b

=>

[[22336, 18872, 14814, 21645, 22333],
 [17827, 25005, 20418, 18932, 17818],
 [19665, 15726, 29575, 15522, 19512],
 [18075, 18785, 20283, 24931, 17926],
 [22097, 21612, 14910, 18970, 22411]]

Chaque élément doit se produire dans chaque position environ 20000 fois. [] .Sort_by (rand) donne de bien meilleurs résultats.

#sort with elements first mapped to random numbers
a=[]
100000.times{a <<  [0,1,2,3,4].sort_by{rand}}

#count how many times each number occurs in each position
...

=>

[[19913, 20074, 20148, 19974, 19891],
 [19975, 19918, 20024, 20030, 20053],
 [20028, 20061, 19914, 20088, 19909],
 [20099, 19882, 19871, 19965, 20183],
 [19985, 20065, 20043, 19943, 19964]]

De même pour [] .shuffle (ce qui est probablement le plus rapide)

[[20011, 19881, 20222, 19961, 19925],
 [19966, 20199, 20015, 19880, 19940],
 [20062, 19894, 20065, 19965, 20014],
 [19970, 20064, 19851, 20043, 20072],
 [19991, 19962, 19847, 20151, 20049]]

Autres conseils

array.shuffle

Qu'en est-ce?

méthodes auxiliaires pour Enumerable, Array, Hash et cordes qui vous permettent de choisir un élément aléatoire ou mélanger l'ordre des objets.

http://raa.ruby-lang.org/project/rand/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top