我想随机迭代一个范围.每个值只访问一次,最终将访问所有值.例如:
class Array
def shuffle
ret = dup
j = length
i = 0
while j > 1
r = i + rand(j)
ret[i], ret[r] = ret[r], ret[i]
i += 1
j -= 1
end
ret
end
end
(0..9).to_a.shuffle.each{|x| f(x)}
Run Code Online (Sandbox Code Playgroud)
哪个f(x)是对每个值进行操作的函数.一个费雪耶茨洗牌用于有效地提供随机排序.
我的问题是shuffle需要在阵列上操作,这并不酷,因为我正在使用天文数字大的数字.Ruby会快速消耗大量的RAM,试图创建一个怪异的数组.试想一下,替换(0..9)用(0..99**99).这也是以下代码不起作用的原因:
tried = {} # store previous attempts
bigint = 99**99
bigint.times {
x = rand(bigint)
redo if tried[x]
tried[x] = true
f(x) # some function
} …Run Code Online (Sandbox Code Playgroud)