2012-06-20 40 views
5

所以基本上爲了好玩,我試圖產生一列數字(7個位數只有0和1) 我的代碼的很短:如何獲得隨機的0和1的數字

a = rand(0000000-1111111) 
b = 220 
a1 = rand(0000000-1111111) 
a2 = rand(0000000-1111111) 
a3 = rand(0000000-1111111) 
a4 = rand(0000000-1111111) 
a5 = rand(0000000-1111111) 

while b !=0 
    puts a 
    puts a2 
    puts a3 
    puts a4 
    puts a5 
end 

我的問題是不是生成0和1的隨機列全部使用數字。

+0

使一個空字符串。一次生成一個數字,例如rand(0-1),並將其追加到最初爲空的字符串中。儘可能多的數字,你想要的數字。不能以這種或那種方式告訴語言,你不能以這種方式處理小數。對不起,我不能爲你做代碼 - 我沒有安裝ruby實現... –

+0

你看過隨機函數的工作原理嗎?和減法?和循環終止? –

+2

如果您可以輕鬆打印二進制文件,則可以從0-127生成數字並打印它們的二進制格式。 – nhahtdh

回答

12

這裏的idiomaticish紅寶石:

5.times do 
    puts (1..7).map { [0, 1].sample }.join 
end 

讓我們來解開它:

5.times do...end是不言自明。在doend之間做五次。

(1..7)生成一個包含7個元素的數組。我們實際上並不關心它裏面的內容。 map返回一個新的數組,其中每個元素是調用大括號之間的內容的結果。所以七次我們將調用[0, 1].sample並將結果壓縮到一個數組中。當然,sample本身隨機選擇01。最後.join將數組變成一個字符串。例如,如果我們說.join('-'),它會在每個元素之間加一個連字符(1-0-0-1-1-1-0-1)。但是由於我們沒有指定任何東西,它不會在每個元素之間放置任何東西(10011101)。

而你有它。

正如其他人已經指出的那樣,對於這個特定的問題,可以通過使用二進制來做更快更短的事情。儘管我認爲這不是Ruby途徑。就速度而言,「不成熟的優化是所有邪惡的根源」,如果您對暴力緩慢的代碼有暴力反感,那麼無論如何您都不應該編寫Ruby。關於可讀性,這種方式可能會更短,但上述方式更清晰。 「哦,我們做了五次,這將會打印出一個長度爲7的......隨機的0和1的序列......作爲一個字符串」。它幾乎像英語(如果你知道單詞map(定義三))。

+0

我想這取決於問題陳述和程序存在的_reason_。當我聽說要生成七個'0'或'1'數字時,我只能想到'0..127'的表示,所以它對我來說是最自然的。你聰明的'(1..7)'避免了那些用在幼稚代碼中的變量的可怕擴散 - 並教導了製作一個很快被丟棄的匿名數組的有用工具。 – sarnold

+0

您的版本將會更容易_extend_到N列'a','7'和'€'字符 - 但如果問題與_number_表示緊密相關,minitech的版本會更加自然。 – sarnold

+0

下面是我使用的這段代碼的一個修改版本(有時它會生成隨機的ASCII碼:D)'code'5.times puts puts(1..7).map {rand(2)} .join end'code ' – Delta

10

解決這個最好的辦法可能是做進制轉換:

someNumber = rand(1 << 7) # Seven digits, max; 1 << 7 is 10000000 in binary. 

puts someNumber.to_s(2).ljust(7, '0') # 10110100, e.g. 
+0

爲什麼ljust 4而不是7? – DGM

+0

@DGM:我有*真的*大手指;) – Ryan

+0

幸運的是,我得到了一個「0000」的輸出:D – DGM

1

Ruby沒有從要專門格式的數字你rand()輸入明白。

取而代之的是隨機生成每個數字(rand(2))並從這七個變量中構建出整個數字。將結果打印在一行上,然後重新啓動循環。

另一種方法是在0127之間生成一個隨機數,然後將其格式化爲二進制輸出。這在隨機數生成器中花費的時間少得多,並大大減少了程序中的變量。

這兩種方法都適用於學習計劃。試試看看你喜歡哪個版本。試着去理解爲什麼你更喜歡某種方式。

+0

有人可以告訴我如何做選項2? – Delta

+0

[Minitech的回答](http://stackoverflow.com/a/11111899/377270)有很好的報道。 :)我不希望將數字轉換爲二進制,就像'to_s(2)'一樣簡單。 – sarnold

2

推導@ MiniTech移動的回答

5.times { puts "%07b" % rand(128) } 
1

的下面是產生的任意數目的特定長度的二進制數(默認爲1)的方法:

def random_binary(length, n=1) 
    raise ArgumentError if n < 1 
    (1..n).map { "%0#{length}b" % rand(2**length) } 
end 

random_binary(7, 5) 
#=> ["0011100", "1001010", "0101111", "0010101", "1100101"]