2013-04-25 88 views
4

我使用securerandom,問題是,它是包括數字"0",如0..56,和0..46而不是1..561..46(彩票千萬不包括0位)。在下面的第二個兆數輸出中可以看到0。我想我想出了一個方法來排除0 s(char1,char2),但我失敗了。試圖使用一個包含範圍與SecureRandom.random_number紅寶石2.0.0

當我使用rand(1..56)與包容性範圍它工作得很好(但幾個職位建議遠離rand())。但是,當我嘗試使用char1char2以下securerandom包含範圍它不起作用。

 
Error: 
[[email protected] 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}" 


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

回答

1

所述的文檔SecureRandom狀態:

如果一個正整數被給定爲N,:: RANDOM_NUMBER返回一個整數:0 < = :: RANDOM_NUMBER <ñ。

因此,這應該做的伎倆:

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

這將導致在範圍1..quickpick,包括一個隨機數。

如果不添加1,則最終結果範圍爲0..(quickpick-1)(含)。

+0

感謝您的快速響應。 Def幫助我! – nanotechz9l 2013-04-25 04:09:05

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

這也是一個很大的反響。我嘗試了upvote,但sys提到我不能這樣做,直到我有15個聲望點(這是愚蠢的imo)。謝謝你的幫助。 – nanotechz9l 2013-04-25 04:10:58

+0

我很高興保持這一個方便。 – nanotechz9l 2013-04-25 04:11:59

+0

不客氣。感謝您的評論! – 2013-04-25 04:18:22

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

感謝您的反饋。如果可以的話,我會加倍努力。我選擇不堅持真正的單線的原因是因爲百萬有五個數字,範圍從1..56,第六個巨大的數字從1..46。我最終會看到我是否可以製作符合上述規格的單線遊戲。 – nanotechz9l 2013-04-25 19:18:22

+0

感謝您的百萬次修訂。你不需要這樣做,大聲笑,因爲我想掙扎一點;)但感謝真棒支持。我喜歡這個社區! – nanotechz9l 2013-04-25 21:53:02

+0

不客氣。您的反饋激勵我嘗試着把它做好。 – pjs 2013-04-26 00:19:37