【问题标题】:Generate a random number with a seed between a range in ruby生成一个随机数,种子在 ruby​​ 范围内
【发布时间】:2017-06-02 01:58:39
【问题描述】:

我正在尝试让我网站上的横幅图片每天更改一次。我可以看到 ruby​​ 有srand,它可以让我输入日期的数字并在同一天每次调用它时返回相同的结果,但这会返回一个很长的数字。我还看到 rand 让我使用像 rand(a..b) 这样的范围。

有什么方法可以像使用 rand 一样使用 srand 的范围?

【问题讨论】:

  • 我不明白你的问题。使用srand 播种不会改变您可以调用rand 的任何方式,那么问题是什么?如果您发布一些实际代码来说明您认为存在的问题,这将有所帮助。
  • 我可以将 srand 和 rand 结合起来吗?我只是在寻找可以在每天变化的范围之间获得数字的任何方法。
  • 哦,我明白我误解了 srand 的工作原理。我认为返回值是种子生成的随机数。我知道我可以在打电话给 rand 之前打电话给 rand。这会影响我的 rails 应用程序中的任何其他组件吗?或者我可以安全地执行此操作吗?
  • srand 确定调用rand 创建的值的顺序。但是,您可以拥有多个 Random 类实例,并独立为它们播种。
  • @Qwertie 你想要一个随机横幅还是一个不同的横幅,例如通过列表循环?

标签: ruby random


【解决方案1】:

您可以使用您喜欢的任何种子值创建一个特殊/指定的随机数生成器:

special = Random.new 42 # create a new instance of Random seeded with 42
20.times { p special.rand(5..10) } # generate 20 random ints in range 5 to 10

您的special 实例Random 独立于kernel#rand,除非您使用srand 使用相同的种子值对其进行初始化。

【讨论】:

  • 啊,太完美了。感谢您的回答。
【解决方案2】:

您可以使用日期的Julian day number 作为种子:

require 'date'
Date.new(2017, 6, 1).jd #=> 2457906
Date.new(2017, 6, 2).jd #=> 2457907
Date.new(2017, 6, 3).jd #=> 2457908

这可以用来生成一个随机的每日索引:

def number_of_banners
  10
end

def daily_banner_index(date = Date.today)
  Random.new(date.jd).rand(number_of_banners)
end

daily_banner_index
#=> 8

或者一个随机的数组中的每日元素:

def banners
  %w(foo_banner bar_banner baz_banner)
end

def daily_banner(date = Date.today)
  banners.sample(random: Random.new(date.jd))
end

daily_banner
#=> "bar_banner"

【讨论】:

    【解决方案3】:

    为了避免破坏我应用程序其余部分的随机数生成器,我使用了

    (Date.today.to_s.gsub('-','').to_i) % number_of_banners
    

    虽然不是完全随机的,但对于这种情况它应该足够好,但我会对更好的解决方案感兴趣。

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2020-06-06
      • 1970-01-01
      • 2011-08-26
      • 2010-12-24
      • 2021-04-05
      相关资源
      最近更新 更多