2017-04-16 102 views
2

有沒有任何算法,它可以在合理的時間內給出列表的混沌排列?我使用Python,但我擔心,給定的洗牌函數將不會提供一個很好的解決方案,由於給定列表中1.1億個元素的長度。混沌排列

我做了一些谷歌搜索,並沒有發現任何有用的結果,將是如果有這樣的事真的很驚訝,但我會很感激的答案

+0

「合理」多少時間?當你嘗試過'洗牌'需要多少時間? – rici

+0

花了超過10分鐘,然後我取消了。這太長了。我需要這樣做1000次左右,如果這需要幾個小時左右,那就沒關係。對於一個排列,運行時間爲30秒就足夠了,但更多的方式會太多 – Illidor

+0

在這種情況下,您需要提供更多信息。在我不是很強大的筆記本電腦上,從隨機導入shuffle'$'\ n''a = list(範圍(1100000)); shuffle(a)'花費了0.6秒時間python -c'。 (如果我把'a'列表列出,但不會更長,花費的時間會稍長一些。) – rici

回答

1

使用洗牌。它足夠快並且適合任何實際用途。

1

只是想解決以所有組合都有可能產生洗牌的方式。正如你所說的,僞隨機數發生器受限於你可以創建的組合數量。要創建真正的隨機播放,你需要真正的RNG。

步驟1:使用在線RNG獲得足夠的隨機數以滿足熵要求(即檢索RN的日誌(n!)/字數)。請參閱https://softwareengineering.stackexchange.com/questions/76822/i-need-a-true-random-number-generator-web-service以獲取更多詳細信息

步驟2:一旦您有足夠長的RN,即k,問題就會變成創建第k個排列。搜索互聯網,你會發現很多解決方案。例如。 Given n and k, return the kth permutation sequence