Python 两个不同编辑器中的同一种子给了我不同的结果(Pycharm和Jupyter笔记本)

Python 两个不同编辑器中的同一种子给了我不同的结果(Pycharm和Jupyter笔记本),python,jupyter-notebook,pycharm,random-seed,Python,Jupyter Notebook,Pycharm,Random Seed,我有以下代码: 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

我有以下代码:

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笔记本中运行这段代码时,我会在每段代码中采样不同的ID。发生什么事了

p.S

我在最后一行使用了分号,因为我发现如果我尝试在一行设置种子,然后在下一行进行采样-即使在同一IDE中,每次运行都会得到不同的结果。这对我来说真的很神秘。我使用Python3.7

这种行为的原因在于
set
Set
是根据对象的
hash
值(集合的元素必须是可散列的,即必须有)从对象构造的,并且
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
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
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[50]: ['p', ']', ' ']
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[32]: ['p', ']', ' ']
2/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
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
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[50]: ['p', ']', ' ']
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[32]: ['p', ']', ' ']
知道问题的根源,你可以选择一种方法来解决问题。例如,使用排序后的

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
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
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[50]: ['p', ']', ' ']
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[32]: ['p', ']', ' ']
2/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
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
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[50]: ['p', ']', ' ']
random.seed(1234)
random.sample(sorted(arr1), 3)
Out[32]: ['p', ']', ' ']

@Carcigenicate是同一个版本,在同一个虚拟环境中(我为这个项目创建的)@Carcigenicate我再次检查-他们都设置为使用3.7.3汉克斯!这确实是问题所在!你能解释一下为什么
sorted()
会修复它吗?我不太明白。@Corel
random.sample
根据随机生成的索引返回
k
3
)。初始化
random.seed
将保留索引生成。由于
sorted
返回一个排序列表,因此始终返回相同的值
set
sample
中,由于
set
是无序的,因此返回的值是相同索引中的值,但根据
元组中的当前顺序。