2012-05-19 32 views
5

Python documentation爲random.shuffle,它接受一個列表,並會隨機的順序,如果它的元素:Python的random.shuffle限制

注意,即使相當小LEN(X)的 總數x的排列大於大多數隨機數 發生器的週期;這意味着長序列的絕大部分排列可能永遠不會生成 。

這是真的對任何語言,因爲限制似乎取決於隨機數發生器?是否可以編寫一個函數來生成任意長的列表的任何可能的排列?

+0

我假設你的意思是「可行」而不是「可能」。 –

+0

我的意思是可行的,但現在我很好奇,如果它不可行,但是可能,我們在說什麼瘋狂? – Colin

+4

請參閱http://stackoverflow.com/questions/3062741/maximal-length-of-list-to-shuffle-with-python-random-shuffle和http://mail.python.org/pipermail/python-dev/ 2006年6月/ 065815.html(按照線程,這是一個真實的,如果不是太嚴重,問題)。 – TryPyPy

回答

3

請參閱http://mail.python.org/pipermail/python-ideas/2009-March/003670.html。它開始出現問題的確切長度取決於PRNG,但基本問題始終適用。

@TryPyPy鏈接到的上一個問題也集中在Python上,但接受的答案很好地解釋了爲什麼它總是會發生。套用,你能想象一個天真的洗牌算法,這種方式工作:

  1. 生成一個列表,p輸入的所有可能的排列
  2. 得到一個隨機數,x,從您的PRNG
  3. 的的,洗牌名單p[x]

如果p比所有可能x s表示該PRNG可以產生的名單更長,一些置換的不可達。

由於花式洗牌算法的核心是這樣做,而不必在丟棄其中的一個之前生成所有可能的排列,唯一的方法是獲得真正的隨機性來源。

2

是的,這是可能的。您可以編寫一個置換生成器,它使用random.SystemRandom作爲您的所有決定。

這樣做的缺點是,當您的操作系統收集更多的熵供您使用時,您的程序可能不得不停止任意長的時間。