【问题标题】:How to print out a random number between a range? [duplicate]如何打印出范围之间的随机数? [复制]
【发布时间】:2011-12-31 20:27:02
【问题描述】:

我有以下,但它不起作用:

<%= (5..30).sample %>

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    试一试。

    <%= [*5..30].sample %>
    

    ...或...

    <%= rand(5..30) %>
    

    【讨论】:

    • 第一种方案效率低。好在它不是 5 到 100 万之间的随机数……第二种解决方案仅适用于 Ruby 1.9.3。这个问题之前已经回答过:stackoverflow.com/questions/198460/…
    • @Marc-AndréLaortune:是的,我同意所有事情。我会投出我的近距离投票。
    • 兰德效率更高
    【解决方案2】:

    这将在该范围内生成一个随机数:

    5 + rand(25)
    

    只需将最小值添加到 rand(max-min)。

    【讨论】:

      【解决方案3】:

      Range 没有 #sample 方法。请改用来自Array 的那个。

      <%= (5..30).to_a.sample %>
      

      【讨论】:

        【解决方案4】:

        对于 1 个随机数:

        a = (5...30).sort_by{rand}[1]
        # => 7
        

        这似乎比其他人建议的更冗长,但从这里,很容易从同一范围内选择三个随机唯一数字:

        a = (5...30).sort_by{rand}[1..3]
        # => [19, 22, 28]
        

        或 20:

        a = (5...30).sort_by{rand}[1..20]
        # => [7, 12, 16, 14, 13, 15, 22, 17, 24, 19, 20, 10, 21, 26, 29, 9, 23, 27, 8, 18] 
        

        可能对需要在侧边栏中显示 5 个随机 foo 的人有用

        编辑: 感谢 Marc-Andre Lafortune,我发现以下内容要好得多:

        a=[*5..30].sample(3)
        

        【讨论】:

        • 效率极低!您的解决方案是 O(n log n) 而不是 O(1) 中的解决方案!如果您需要一个数组中的许多随机样本,请使用Array#sample
        • 感谢@Marc-Andre,你每天都能学到新东西。我根据您的建议更新了我的答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多