我有以下代码:
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。这是怎么回事?
附注
我在最后一行使用了分号,因为我发现如果我尝试在一行上设置种子,然后在下一行上采样 - 即使在同一个 IDE 中,每次运行都会得到不同的结果。这对我来说确实很神秘。我使用Python 3.7
最佳答案
造成这种行为的原因在于set
。 Set
是根据对象的 hash
值(集合的元素必须是可哈希的,即必须具有 __hash__
method )和 hash
值构造的启动另一个控制台时有所不同。 (并不总是如此,但这是另一个主题)。
例如,同一 IDE 中的两个控制台有结果:
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
了解问题的根源,您可以选择解决问题的方法。例如,使用已排序
:
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', ']', ' ']
关于python - 两个不同编辑器中的相同种子给我不同的结果(Pycharm 和 Jupyter Notebook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59480278/