例如假设我有以下范围
5031..5032 6248..6249
如何生成这两个范围内的随机数?
最佳答案
简单的方法:
(r1.to_a + r2.to_a).choice
更快且内存效率更高的通用解决方案包括计算总范围大小、生成随机数,然后将数字标准化为它所在的范围。
更新:好的,知道了。此解决方案适用于任意数量的范围,并且不会生成巨大的数组或遍历范围本身。 (它在 Ranges 数组而不是 Range 元素数组上迭代两次。)
def rangerand *r
r.inject(rand(
r.inject(0) do |accum, rng|
accum + rng.last - rng.first + 1
end
)) do |accum, rng|
rngsize = rng.last - rng.first + 1
return rng.first + accum if accum < rngsize
accum - rngsize
end
# raise 'this "cannot happen"'
end
puts rangerand 1..3, 999..1001, 10_200..10_205
嘿,我以前从未在同一个表达式中使用过两个 #inject
。
关于ruby - 如何使用 Ruby 在非连续范围内生成随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522780/