4

私は使用securerandomしていますが、問題は、, andの代わりに, and の"0"ように数字が含まれていることです(宝くじには 0 桁が含まれていません)。0 は、以下の 2 番目のメガ数値出力で確認できます。以下の s を ( , ) で除外する方法を考え出したと思ったのですが、失敗しました。0..560..461..561..460char1char2

包括的な範囲で使用するrand(1..56)と、問題なく動作します(ただし、いくつかの投稿では、に近づかないことをお勧めしますrand())。char1ただし、char2以下で包括的な範囲を使用しようとすると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 と Array の比較に失敗しました (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
4

3 に答える 3

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...

これにより、範囲内の乱数が生成され1..quickpickます。

を追加しないと1、最終的には の範囲0..(quickpick-1)になります。

于 2013-04-25T03:55:47.023 に答える