2014-02-13 2407 views
1

我想生成範圍內的隨機數(0 ...「MAX」)。我想做一個循環,以便每次通過循環時都會生成一個新的唯一隨機數(不應該重複)。循環將繼續總共「MAX」次。應該有總共產生的「MAX」個隨機數。排序時,值應爲0 ...「MAX」;沒有重複。如何在python中生成一個隨機數的範圍而不重複

限制條件: - 假設MAX比int大得多。 (沒有內存在內存中存儲所有數字排列)

我建議的解決方案: 如果我從0 ...種子發生器... MAX將允許我打印0和MAX之間的每一個唯一的數字,如下面的函數?假設沒有空間存儲所有數字並對其進行洗牌。

for x in range (0, MAX): 
    random.seed(x) 
    num=random.randint(0, MAX) 
    print("seed = ",x, " random number = ", num) 

如果上面的答案是肯定的,那麼這一代是可逆的(我可以從隨機數中得到種子)?在這種情況下,如果種子(鍵)和範圍的長度相同,這會被認爲是一種分組密碼嗎?

+2

你能解釋一下你想要的輸出嗎?你的代碼是無效的,因爲'randint'需要參數。此外,您的代碼中沒有任何內容會阻止重複。爲什麼在每次迭代中重新生成發電機? – BrenBarn

+0

Tnx。固定。我想要一個新的隨機數在每個迭代0 ... Max的範圍內,並且它不能與之前的數字重複。我正在播種它,因爲我猜測獨特的種子意味着PRG第一次迭代的唯一編號,但我不知道在重複之前prg需要的最大種子數是多少。假設沒有內存來存儲所有的數字。 – user1144251

+2

「被認爲是一種分組密碼」 - 如果您打算將其用於任何類型的加密目的,**不要**。 – user2357112

回答

0

如果你想在特定的範圍內得到的所有號碼,

  1. 要麼我們必須存儲生成隨機數,並比較他們對新產生的隨機數

    import random 
    result = [] 
    
    # hash values of numbers between -5 to 256 are the same as the 
    # numbers themselves. So, whatever may be the order, set will have them 
    # in the sorted order. So, `result` cannot be a `set` here. 
    
    for x in range (0, 10): 
        num = random.randint(0, 10) 
        while num in result: 
         num = random.randint(0, 10) 
        result.append(num) 
    print result 
    
  2. 或者我們可以生成清單並像這樣整理它

    data = range(10) 
    import random 
    random.shuffle(data) 
    print data 
    

    因爲您已經將人口列爲清單而random.shuffle是就地操作,所以結果不必存儲在單獨的清單中。

+0

假定沒有足夠的內存將所有內容存儲在內存中。 – user1144251

+0

@ user1144251那麼你將如何生成隨機數並存儲它? – thefourtheye

+0

第一種方式應該使用set,而不是list。列表(向量)需要O(N)時間來查找它是否有一個項目,而對於基於散列的設置,它是O(1)(平均值)。 –

0

隨機模塊具有sample function,其上產生unique elements預測。它是用來作爲在下面的示例:

random_list = random.sample(xrange(10000000), 60) 
# generates a list of 60 random numbers in the 
# range 0 to 10000000 without repetition 

不過,你要知道,它會拋出一個異常,如果列表的長度比人口規模,例如更大

random_list = random.sample(xrange(5), 60 # you will get a ValueError here 
+1

「請注意,如果列表的長度大於總體的大小,它會重複」 - 否則不會。它會引發一個'ValueError'。你爲什麼認爲這會重演? – user2357112

+1

另外,你不能從'5'中抽樣。 – user2357112

+0

@ user1144251您正在尋找'random.shuffle',就像我在回答中所顯示的那樣。 – thefourtheye

1

你可以這樣做:

input = set() 
for i in range(MAX): 
    input.add(random.randrange(x,y)) 
print input 

與x的範圍和y它會選擇一些隨機值。無重複意味着你可以使用set。所以我添加這些值來設置。

只是試試這一個。

相關問題