尝试使用SecureRandom.random_number ruby​​ 2.0.0的包含范围

时间:2013-04-25 03:44:13

标签: ruby random range

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

当我使用rand(1..56)一个包含范围时,它可以正常工作(但有几个帖子建议远离rand())。但是,当我尝试在char1下使用char2securerandom以下的包含范围时,它不起作用。

Error:
[nil@nil lottery]$ ./mega_millions.rb 
/dev/null/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/securerandom.rb:216:in `<': comparison of Fixnum with Array failed (ArgumentError)
        from /dev/null/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/securerandom.rb:216:in `random_number'
        from ./mega_millions.rb:42:in `<main>'

我希望得到任何反馈并朝着正确的方向发展。

谢谢!

#!/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

3 个答案:

答案 0 :(得分:1)

您可以简单地将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(', ')

答案 1 :(得分:1)

SecureRandom州的文件:

  

如果给出正整数为n,则:random_number返回一个整数:0&lt; = :: random_number&lt; Ñ

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

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

这将导致1..quickpick范围内的随机数,包括在内。

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

答案 2 :(得分:1)

真正的单行:

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(', ')