[英]Ruby: using `.each` or `.step`, step forward a random amount for each iteration
(也對其他類似的非Rails方法開放)
給定(0..99)
,返回按順序隨機選擇的條目。
結果示例:
0, 5, 11, 13, 34..
3, 12, 45, 67, 87
0, 1, 2, 3, 4, 5..
(當然不太可能)
目前的想法:
(0..99).step(rand(0..99)).each do |subindex|
array.push(subindex)
end
但是,這為所有步驟設置了一個隨機值,而我正在尋找每個步驟都是隨機的。
獲取要選擇的元素數量的隨機值,隨機獲取此元素數量,進行排序。
(0..99).to_a.sample((0..99).to_a.sample).sort
#⇒ [7, 20, 22, 29, 45, 48, 57, 61, 62, 76, 80, 82]
或者,更短一些(歸功於@Stefan):
(0..99).to_a.sample(rand(0..99)).sort
#⇒ [7, 20, 22, 29, 45, 48, 57, 61, 62, 76, 80, 82]
或者,以更實用的方式:
λ = (0..99).to_a.method(:sample)
λ.(λ.()).sort
要精確輸入N
數字:
N = 10
(0..99).to_a.sample(N).sort
#⇒ [1, 5, 8, 12, 45, 54, 60, 65, 71, 91]
有很多方法可以實現它。
例如,這是一個緩慢而又簡單的例子:
# given `array`
random_indexes = (0...array.size).to_a.sample(rand(array.size))
random_indexes.sort.each { |i| puts array[i] }
或者為什么不只是:
array.each do |value|
next if rand(2).zero?
puts value
end
或者您可以使用Enumerator#next
隨機次數。
下面的示例基於從數組[true, false]
隨機選擇的true
或false
返回具有給定范圍內的隨機條目的排序數組:
(0..99).select { [true, false].sample }
=> [0, 3, 12, 13, 14, 17, 20, 24, 26, 28, 30, 32, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, 62, 65, 67, 69, 70, 71, 79, 81, 84, 86, 91, 93, 94, 95, 98, 99]
為了減少返回更大數組的機會,可以修改true/false
數組以包含更多false值:
(0..99).select { ([true] + [false] * 9).sample }
=> [21, 22, 28, 33, 37, 58, 59, 63, 77, 85, 86]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.