集合中的随机数是聚类的

时间:2013-10-11 09:39:41

标签: python cygwin

我想生成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是否与此问题有任何关系)

3 个答案:

答案 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()