我想生成10万个随机数,这就是我想出的:
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是否与此问题有任何关系)
答案 0 :(得分:2)
我建议您使用random.sample:
>>> import random
>>> s = random.sample(xrange(1, 10 ** 6), 10 ** 5)
答案 1 :(得分:2)
Python的set
类型不保留顺序。集合中元素的顺序取决于插入顺序和您添加的元素的散列。 CPython(最流行的Python实现)使用identity函数作为整数的哈希函数(-1
除外,由于内部原因,它被散列为-2
)。通过这个简单的哈希函数,您可以获得观察到的“聚类”。
解决方案是使用结果列表* fromisde“与集合以保持结果按照生成它们的顺序。或者只使用random.sample()
,这已经是这个算法的优化实现正确的事情。
答案 2 :(得分:-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()