2013-02-21 80 views
0

這裏我試圖看看Array#shuffle!如何處理數組對象。於是,我開始在我IRB擺弄它:Array#爲什麼洗牌!不適用於嵌套數組?

[1,2,3] 
#=> [1, 2, 3] 
[1,2,3].shuffle! 
#=> [3, 1, 2] 

在上面的代碼中,我明白它是如何工作的。而下面我試圖用更加艱難的方式來看待它從每個角落。

[1,2,5] 
#=> [1, 2, 5] 
[1,2,5]<<[1,2,5] 
#=> [1, 2, 5, [1, 2, 5]] 

直到現在我很好。

[1, 2, 5, [1, 2, 5]].shuffle! 
#=> [5, 1, 2, [1, 2, 5]] 

有了上面的一段代碼我有困惑。所以下面的問題就在我的腦海:

  • (一)爲什麼不shuffle!遞歸工作?正如我預期的內部陣列[1, 2, 5]的輸出也將被洗牌。但沒有發生。

  • (二)爲什麼shuffle!不推諉元件排列[1, 2, 5],而只能與陣列[1, 2, 5, [1, 2, 5]]1, 2, 5,要素是什麼?我輸出的結果是[[1, 2, 5],5, 1, 2]。那麼爲什麼元素數組沒有改變它的位置,而只是正常的元素呢?

編輯:

非常有趣的現象則顯示:

a=[1,2,4] 
#=> [1, 2, 4] 
a<<[7,8] 
#=> [1, 2, 4, [7, 8]] 
a.shuffle! 
#=> [[7, 8], 1, 4, 2] 
a.shuffle! 
#=> [4, 1, [7, 8], 2] 
a.shuffle! 
#=> [[7, 8], 2, 1, 4] 
irb(main):006:0> 

是否洗牌真正遵循任何命令或它的隨機洗牌?

回答

2

a)shuffle!更改數組中對象的順序,這可以是任何東西的集合,所以該方法不能假定裏面的東西也可以或應該被洗牌。

b)我真的不知道這個問題與a)有什麼不同。你能解釋一下你覺得混亂嗎?

+0

我剛更新了我的描述。 – 2013-02-21 09:57:23

+0

查看文檔和源代碼(http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-shuffle),它表明洗牌是隨機的。你期望它會是什麼? – 2013-02-21 12:02:35

2

a)爲什麼shuffle!會遞歸?它對它傳遞的對象起作用,在你的例子中它是一個包含4個項目的數組 - 它對它們進行洗牌。其中之一是一個陣列既不在這裏也不在那裏,其中一個可能是所有它關心的驢。

b)它不洗牌數組元素,你應該多次嘗試過你的小IRB測試,你會發現數組只是沒有移動。

關於您的編輯,您究竟想要在這裏展示什麼,我沒有看到任何有趣的行爲?沒有模式,洗牌是僞隨機的。

0

如果你確實想陣列遞歸洗牌,沒有任何問題:

# encoding: utf-8 

a = [1,2,3] 
a << [6,7,8] 

class Array 
    alias shuffle_orig shuffle 
    def shuffle 
    self.shuffle_orig.map { |e| e.respond_to?(:shuffle) ? e.shuffle : e } 
    end 
end 


3.times do 
    p a.shuffle 
end 

,這導致:

#⇒ [2, [8, 6, 7], 3, 1] 
#⇒ [3, 1, [7, 6, 8], 2] 
#⇒ [1, [8, 7, 6], 3, 2] 

的爆炸版本可能是小猴子打補丁也是如此。

0
a=[1,2,4] 
#=> [1, 2, 4] 
a<<[7,8] 

a.each_with_index do |element, index| 

    puts "Index: #{index} element: #{element}" 
end 

a<<[7,8]你追加一個新的對象爲a陣列。 該對象將具有唯一的索引。 隨機方法使用此索引爲其目的..

Index: 0 element: 1 
Index: 1 element: 2 
Index: 2 element: 4 
Index: 3 element: [7, 8] 

追加陣列[7,8]被認爲是1點的對象,並且因此它的內部元件不會被混洗在陣列a的元素。

0

我敢肯定,你可以想象一種情況,你需要洗牌一組數組的順序是重要的順序。在這種情況下,shuffle非常方便,如果您的需求發生變化,使用shuffle方法很容易實現遞歸混洗。但是,如果Ruby僅包含遞歸混洗,則必須編寫原始非遞歸混洗方法的邏輯,並且無法用遞歸混洗方法優雅地實現解決方案。我認爲大多數語言都傾向於將簡單,多功能的方法應用於更復雜的方法。