python seed()不保持相同的序列

时间:2014-04-14 17:16:05

标签: python random sequence seed

我正在使用random.seed()来尝试保持random.sample()与我从列表中采样更多的值相同,并且在某些时候数字会改变.....我在哪里认为seed()函数的目的是保持数字相同。

我做了一个测试,证明它没有保持相同的数字。

import random

a=range(0,100)
random.seed(1)
a = random.sample(a,10)
print a

然后将样本更高地更改并且序列将改变(至少对我来说他们总是这样做):

a = random.sample(a,40)
print a

我是一个新手,所以也许这是一个简单的解决方案,但我很感激任何帮助。 谢谢!

3 个答案:

答案 0 :(得分:7)

如果您要从发电机中抽取独立样本,那么您将会发生什么样的情况:

In [1]: import random

In [2]: random.seed(1)

In [3]: [random.randint(0, 99) for _ in range(10)]
Out[3]: [13, 84, 76, 25, 49, 44, 65, 78, 9, 2]

In [4]: random.seed(1)

In [5]: [random.randint(0, 99) for _ in range(40)]
Out[5]: [13, 84, 76, 25, 49, 44, 65, 78, 9, 2, 83, 43 ...]

如您所见,前十个数字确实相同。

事实上,random.sample()正在绘制样本,而没有替换正在阻碍。要了解这些算法的工作原理,请参阅Reservoir Sampling。本质上发生的是以后的样本可以将之前的样本推出结果集。

一种替代方案可能是对一组索引进行混洗,然后采用10或40个第一个元素:

In [1]: import random

In [2]: a = range(0,100)

In [3]: random.shuffle(a)

In [4]: a[:10]
Out[4]: [48, 27, 28, 4, 67, 76, 98, 68, 35, 80]

In [5]: a[:40]
Out[5]: [48, 27, 28, 4, 67, 76, 98, 68, 35, 80, ...]

答案 1 :(得分:4)

只有当种子样本大小保持不变时,似乎random.sample才是确定性的。换句话说,即使您重置种子,生成具有不同长度的样本也不是相同的"随机操作,并且可以给出与使用相同种子生成较小样本不同的初始子序列。换句话说,内部生成相同的随机数,但sample使用它们推导随机序列的方式因您要求的样本量而异。

答案 2 :(得分:3)

您正在假设执行random.sample这样的事情:

def samples(lst, k):
    n = len(lst)
    indices = []
    while len(indices) < k:
        index = random.randrange(n)
        if index not in indices:
            indices.append(index)
    return [lst[i] for i in indices]

给出了:

>>> random.seed(1)
>>> samples(list(range(20)), 5)
[4, 18, 2, 8, 3]
>>> random.seed(1)
>>> samples(list(range(20)), 10)
[4, 18, 2, 8, 3, 15, 14, 12, 6, 0]

但是,random.sample实际执行的方式并非如此; seed确实如何运作,sample没有!