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是否与这个问题有关)

4

3 回答 3

2

我建议为此使用random.sample

>>> import random
>>> s = random.sample(xrange(1, 10 ** 6), 10 ** 5)
于 2013-10-11T09:50:29.797 回答
2

Python 的set类型不保留顺序。集合中元素的顺序取决于插入顺序和您添加的元素的哈希值。CPython(Python 最流行的实现)使用恒等函数作为整数的散列函数(除了,由于内部原因-1,它被散列到)。-2由于这个简单的散列函数,你得到了你观察到的“聚类”。

解决方案是使用结果列表 *alongisde" 与集合来保持结果按照您生成它们的顺序。或者简单地使用random.sample(),这已经是这个算法的优化实现,做正确的事情。

于 2013-10-11T10:07:05.010 回答
-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()
于 2013-10-11T09:58:31.717 回答