2013-10-11 61 views
2

我要生成100K的隨機數字,這就是我想出了:隨機數都集中

from random import randrange, seed 

f=open("tree.in","w") 
s=set() 

seed(99) 
for _ in xrange(1,10**5): 
    while True: 
     x=randrange(10**6) 
     if x not in s: 
      s.add(x) 
      break 

for x in s: 
    f.write(str(x)+"\n") 

f.close() 

不幸的是,在該文件中的數字都聚集起來是這樣的:

524369 
524372 
786520 
786523 
786526 
98 
524387 
106 
108 
111 
786544 
786549 

我可以將它們添加到列表中並進行隨機排序,但浪費空間。
有沒有一種優雅的方法來解決這個問題?
(我不知道如果Cygwin的有什麼這個問題做)

回答

2

我推薦使用random.sample此:

>>> import random 
>>> s = random.sample(xrange(1, 10 ** 6), 10 ** 5) 
-1

不知道你關心的隨機種子(但我更喜歡他們),但添加一個步驟組件,你會得到更好的結果。例如:

from random import randrange, randint, seed 
import time 

f=open("tree.in","w") 
s=set() 

seed(randint(1,10**6) 
for _ in xrange(1,10**5): 
    while True: 
     x=randrange(randint(1,10**5), 10**8, randint(1,10**5)) 
     if x not in s: 
      s.add(x) 
      break 

for x in s: 
    f.write(str(x)+"\n") 

f.close() 
2

Python的set類型不保留順序。組中元素的順序取決於您添加的元素的插入順序和哈希。 CPython(Python最流行的實現)使用身份函數作爲整數的散列函數(除了-1,由於內部原因散列爲-2)。作爲這個簡單散列函數的結果,您可以看到您觀察到的「聚類」。

的解決方案是使用結果* alongisde」同組的列表,以保持結果的順序,你生成它們,或者乾脆用random.sample(),這已經是該alogrithm做正確的事的優化實現。