ruby - 如何使用 Ruby 在非连续范围内生成随机数?

标签 ruby

例如假设我有以下范围

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/

相关文章:

ruby-on-rails - 使用 Authlogic 和 Authlogic OAuth 插件隐式创建用户

ruby - RVM 无法在 Lion : libxml2. 2.dylib 上安装 Ruby 1.9.3

mysql - Rails 4 脚本 + 错误 : Migrating Data From One Table to Another

ruby - 将 ruby​​ 数组中的哈希与其同级数组进行比较

ruby-on-rails - delayed_job 缺少方法

ruby - 在 Ruby 中,#each_pair 在遍历哈希时比 #each 有什么优势?

ruby-on-rails - 如何让 VSCode 在 'end' 后自动插入 'do'

mysql - 续集急切加载时堆栈级别太深

ruby-on-rails - 后台rb定时任务结束

ruby-on-rails - 不使用 Rails 调用 ERB : undefined method 'raw'