【问题标题】:Trying to use an inclusive range with SecureRandom.random_number ruby 2.0.0尝试使用 SecureRandom.random_number ruby​​ 2.0.0 的包含范围
【发布时间】:2013-04-25 03:44:13
【问题描述】:

我使用securerandom,问题是它包含数字"0",如0..56,和0..46而不是1..56和1..46(彩票不包括0 位)。 0 可以在下面的第二个兆数输出中看到。我以为我找到了一种方法来排除下面的0s(char1,char2),但我失败了。

当我使用包含范围的rand(1..56) 时,它工作得很好(但有几篇帖子建议远离rand())。但是,当我尝试在securerandom 上使用包含char1 和char2 的包含范围时,它不起作用。

错误: [nil@nil 彩票]$ ./mega_millions.rb /dev/null/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/securerandom.rb:216:in `'

我将不胜感激任何反馈并推动正确的方向。

谢谢!

#!/usr/bin/env ruby
require 'rainbow.rb'
require 'securerandom'

quick_pick = 56
char1  = ('1'..'56').to_a 

mega_num = 46
char2  = ('1'..'46').to_a 

first  = SecureRandom.random_number(quick_pick)
second = SecureRandom.random_number(quick_pick)
third  = SecureRandom.random_number(quick_pick)
fourth = SecureRandom.random_number(quick_pick)
fifth  = SecureRandom.random_number(quick_pick)
mega   = SecureRandom.random_number(mega_num)

puts "#{first}, #{second}, #{third}, #{fourth}, #{fifth}, #{mega}"


[nil@nil lottery]$ ./mega_millions.rb 
34, 38, 17, 24, 55, 14
[nil@nil lottery]$ ./mega_millions.rb 
30, 26, 7, 4, 32, 0

【问题讨论】:

    标签: ruby random range


    【解决方案1】:

    SecureRandom 的文档说明:

    如果给出一个正整数作为 n,::random_number 返回一个整数:0

    因此,这应该可以解决问题:

    first  = SecureRandom.random_number(quick_pick) + 1
    # And so forth...
    

    这将产生1..quickpick 范围内的随机数。

    如果不添加1,您最终会在0..(quickpick-1) 范围内,包括在内。

    【讨论】:

    • 感谢您的快速回复。 Def帮助了我!
    【解决方案2】:

    您可以简单地将 1 添加到您的随机数中,如下所示:

    quick_pick = 55 # 56 - 1 to account for the offset in your range of numbers
    SecureRandom.random_number(quick_pick) + 1
    

    顺便说一句,更习惯地说,您可以像这样多次运行它:

    numbers = 6.times.collect { SecureRandom.random_number(quick_pick) + 1 }
    

    然后用

    打印出来
    puts numbers.join(', ')
    

    【讨论】:

    • 这也是一个很好的回应。我试图支持它,但系统提到在我有 15 个声望点之前我不能这样做(这很傻 imo)。感谢您的帮助。
    • 我也要把一个班轮放在手边。
    【解决方案3】:

    对于真正的单线:

    puts 6.times.collect{ SecureRandom.random_number(55) + 1 }.join(', ')
    

    除非您在打印后出于某种原因需要保留这些数字。

    稍作修改以产生数百万美元:

    puts 5.times.collect{SecureRandom.random_number(55) + 1}.push(SecureRandom.random_number(45) + 1).join(', ')
    

    【讨论】:

    • 感谢您的反馈。如果可以的话,我会投票。我选择不坚持真正的单线的原因是因为百万有五个数字,范围从 1..56,第六个百万数字范围从 1..46。我最终会看看我是否可以用上述规格制作一个衬里。
    • 感谢百万级的修订。你不必这样做,大声笑,因为我想有点挣扎;)但感谢您的大力支持。我爱这个社区!
    • 不客气。您的反馈促使我努力做到正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多