需要用新的迭代器來增加Enumerable模塊,該迭代器以隨機順序返回集合的元素。關於收集的唯一信息 - 它對每個信息作出響應。沒有其他關於元素的假設。 我有一個解決方案 - 包裝元素融入到數組,然後用樣品的方法:隨機置換迭代器
def each_permuted
tmp = []
self.each do |w|
tmp << w
end
tmp.sample(tmp.length).each do |w|
yield w
end
end
不喜歡它,因爲在這裏我們通過收集兩次(甚至三次tmp.sample隨機排列計數)。 單通過可能嗎?
如果集合只響應'each',那麼您必須至少完成一次以完成一個隨機樣本(因爲否則您甚至不知道概率的長度選擇樣品)。 AFAIK沒有辦法。如果採集項目可以通過任何方式進行尋址,那麼您可以根據地址進行採樣。我認爲你的代碼接近最佳。你可以使用'.shuffle'而不是'.sample(tmp.length)' - 雖然我不知道Ruby的內部結構,但是這有可能讓你稍微快一點。 –
enumerable.to_a.shuffle有什麼問題? – tokland