從Python documentation爲random.shuffle,它接受一個列表,並會隨機的順序,如果它的元素:Python的random.shuffle限制
注意,即使相當小LEN(X)的 總數x的排列大於大多數隨機數 發生器的週期;這意味着長序列的絕大部分排列可能永遠不會生成 。
這是真的對任何語言,因爲限制似乎取決於隨機數發生器?是否可以編寫一個函數來生成任意長的列表的任何可能的排列?
從Python documentation爲random.shuffle,它接受一個列表,並會隨機的順序,如果它的元素:Python的random.shuffle限制
注意,即使相當小LEN(X)的 總數x的排列大於大多數隨機數 發生器的週期;這意味着長序列的絕大部分排列可能永遠不會生成 。
這是真的對任何語言,因爲限制似乎取決於隨機數發生器?是否可以編寫一個函數來生成任意長的列表的任何可能的排列?
請參閱http://mail.python.org/pipermail/python-ideas/2009-March/003670.html。它開始出現問題的確切長度取決於PRNG,但基本問題始終適用。
@TryPyPy鏈接到的上一個問題也集中在Python上,但接受的答案很好地解釋了爲什麼它總是會發生。套用,你能想象一個天真的洗牌算法,這種方式工作:
p
輸入的所有可能的排列x
,從您的PRNGp[x]
如果p
比所有可能x
s表示該PRNG可以產生的名單更長,一些置換的不可達。
由於花式洗牌算法的核心是這樣做,而不必在丟棄其中的一個之前生成所有可能的排列,唯一的方法是獲得真正的隨機性來源。
是的,這是可能的。您可以編寫一個置換生成器,它使用random.SystemRandom
作爲您的所有決定。
這樣做的缺點是,當您的操作系統收集更多的熵供您使用時,您的程序可能不得不停止任意長的時間。
我假設你的意思是「可行」而不是「可能」。 –
我的意思是可行的,但現在我很好奇,如果它不可行,但是可能,我們在說什麼瘋狂? – Colin
請參閱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