两个不同编辑器中的相同种子给我不同的结果(Pycharm 和 Jupyter Notebook)

Same seed in two different editors give me different results (Pycharm and Jupyter Notebook)

我有以下代码:

import json
import pandas as pd
import numpy as np
import random

pd.set_option('expand_frame_repr', False)  # To view all the variables in the console

# read data
records = []
with open('./data/data_file.txt', 'r') as file:
    for line in file:
        record = json.loads(line)
        records.append(record)

# construct list of ids
ids = set()
for record in records:
    for w in record['A']:
        ids.add(w['NAME'])

random.seed(1234); sampled_ids = random.sample(ids,50)

当我 运行 在 Pycharm IDE 中使用此代码一次,然后在 Jupyter Notebook 中使用此代码时 - 我在每个代码中都采样了不同的 ID。怎么回事?

P.S
我在最后一行使用了分号,因为我发现如果我尝试在一行上设置种子然后在下一行进行采样 - 即使在相同的 IDE我每个 运行 得到不同的结果。这对我来说真的很神秘。我用Python 3.7

造成这种行为的原因在于setSet 是根据对象的 hash 值构造的(集合的元素必须是可散列的,即必须具有 __hash__ method),并且 hash 值在启动另一个控制台时会有所不同. (并非总是如此,但这是另一个主题)。 例如,在同一个 IDE:

中有两个 consol 的结果

1/A:

arr1 = set('skevboa;gj[pvemoeprnjpdbr ]p')
random.seed(1234)
random.sample(arr1, 3)
Out[47]: ['p', 'k', ']']
random.seed(1234)
random.sample(arr1, 3)
Out[48]: ['p', 'k', ']']
hash('s')
Out[49]: 1861403979552045688

2/A:

arr1 = set('skevboa;gj[pvemoeprnjpdbr ]p')
random.seed(1234)
random.sample(arr1, 3)
Out[29]: [';', 'a', 'b']
random.seed(1234)
random.sample(arr1, 3)
Out[30]: [';', 'a', 'b']
hash('s')
Out[31]: -2409441490032867064

了解问题的根源,您可以选择一种方法来解决问题。例如,使用 sorted:

1/A:

random.seed(1234)
random.sample(sorted(arr1), 3)
Out[50]: ['p', ']', ' ']

2/A:

random.seed(1234)
random.sample(sorted(arr1), 3)
Out[32]: ['p', ']', ' ']