两个不同编辑器中的相同种子给我不同的结果(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
造成这种行为的原因在于set
。 Set
是根据对象的 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', ']', ' ']
我有以下代码:
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
造成这种行为的原因在于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
了解问题的根源,您可以选择一种方法来解决问题。例如,使用 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', ']', ' ']