2013-10-19 87 views
1

我是Ruby的一個半新手:*(,所以提前感謝你,我儘可能多的學習,我已經搜索了幾個小時,但似乎無法找到答案任何地方。洗牌!在ruby中n次數組

我已經在甲板類寫了這個方法。

def shuffle! 
    @cards.shuffle! 
end 

我想知道,使用這種方法,我可以修改它來洗牌陣列倍,而不是隻有一次,如果沒有的話,是否需要編寫另一個調用.shuffle的方法,並在初始化一個新的Deck後運行這七次,再次感謝任何能夠幫助的人:)

+1

只是一個問題,你爲什麼要這樣做7次? – hirolau

+0

有一個理論,洗牌7次創建最佳的隨機化。我曾向一位數學家朋友詢問過這個問題,他說:「我描述過的混洗算法(完美地切割揹包,然後完美地進行網格劃分)具有所謂的」迭代「算法的特點,因爲它需要輸出最後一輪作爲本輪的輸入,因此可能是混亂的,穩定期與混亂期(即高度複雜)行爲交替.7次洗牌可能是一個邊界點。我認爲7次洗牌可能沒有什麼特別之處雖然......「 – dax

+1

好的,但是這是人類通過特定方式創造」隨機性「的一副真正的撲克牌。多做一次是完全可以理解的。洗牌! - 紅寶石方法不會這樣工作,並且不會從多次洗牌中受益。 – hirolau

回答

3

您可以使用下面的一些技巧,因爲Array#shuffle沒有這樣的功能,只有n次。該文檔是說如果給出rng,它將用作隨機數生成器。

def shuffle!(n=7) 
    n.times { @cards.shuffle! } 
end 

如果你把它a.shuffle只有一次洗牌將在陣列a上完成。如果你打電話爲a.shuffle(random: Random.new(4)),然後洗牌時間是在陣列a隨機的。

+1

如果你改變了簽名以def shuffle!(n = 7),那麼功能將更加緊密地滿足要求,並且可以使用洗牌!方法而沒有指定洗牌的次數。 – Arkhitech

+0

@Arkhitech好的建議..我確實改變了.. –

0

如果你總是要洗牌7倍,我覺得你並不需要傳遞一個參數 - 試試這個:

def shuffle 
    7.times {self.shuffle!} 
end 

initialize

def initialize 
    #your code here 
    @cards.shuffle 
end 
1

你'd可能想根據這些方面做些事情。

class Deck 

    def initialize(cards) 
    @cards = cards 
    end 

    def shuffle!(n = 7) 
    n.times { @cards.shuffle! } 
    @cards 
    end 

end 

cards = [1, 2, 3, 4] 

Deck.new(cards).shuffle! # => [3, 4, 1, 2] 

請注意,該方法將返回@cards的值。