Besoin de compléter le module Enumerable avec un nouvel itérateur, qui renvoie les éléments de la collection dans un ordre aléatoire. La seule information sur la collection - il répond à chacun. Aucune autre hypothèse sur les éléments. J'ai une solution - pour envelopper des éléments dans un tableau, puis utiliser la méthode de l'échantillon:Itérateur de permutation aléatoire
def each_permuted
tmp = []
self.each do |w|
tmp << w
end
tmp.sample(tmp.length).each do |w|
yield w
end
end
ne l'aime pas, parce qu'ici nous traversons collection deux fois (même trois fois le comptage tmp.sample permutation aléatoire). Est-ce possible avec un simple passage?
Si la collection ne répond qu'à 'each', alors vous devez passer complètement au moins une fois pour faire un échantillon aléatoire (car sinon vous ne connaissez même pas la longueur pour la probabilité de choisir des échantillons). Pas moyen de contourner cela AFAIK. Si les éléments de la collection étaient adressables de quelque manière que ce soit, vous pouvez échantillonner en fonction des adresses. Je pense que votre code est proche de l'optimal. Vous pouvez utiliser '.shuffle' au lieu de' .sample (tmp.length) 'cependant - je ne connais pas les internes de Ruby, mais cela a une chance d'être légèrement plus rapide pour vous. –
Quel est le problème avec 'enumerable.to_a.shuffle'? – tokland