4

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

当我使用rand(1..56)包含范围时,它工作得很好(但有几篇文章建议远离rand())。但是,当我尝试使用包含范围char1char2以下范围时,securerandom它不起作用。

错误:
[nil@nil 彩票]$ ./mega_millions.rb
/dev/null/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/securerandom.rb:216:in `<':Fixnum 与数组的比较失败(ArgumentError)
        来自 /dev/null/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/securerandom.rb:216:in `random_number'
        来自 ./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
4

3 回答 3

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(', ')
于 2013-04-25T13:26:00.177 回答
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(', ')
于 2013-04-25T03:54:32.917 回答
1

SecureRandom的文档指出:

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

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

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

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

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

于 2013-04-25T03:55:47.023 回答