random.sample() 如何控制再现性

V.M*_*dev 2 python random random-seed

有没有办法控制 random.sample()?我以标准方式修复种子:

def seed_everything(seed=42):
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True
 
seed_everything(42)
Run Code Online (Sandbox Code Playgroud)

然而,下面代码的结果每次都不同:

idxT=[0,1,2,3,4,5,6]
idxT = [
        idxT[j] for j in sorted(random.sample(range(len(idxT)), 3))
    ]
idxT
Run Code Online (Sandbox Code Playgroud)

rhu*_*itz 5

我认为 Ry 走在正确的轨道上:如果您希望random.sample()每次调用时的返回值都相同,则必须random.seed()在每次调用之前使用相同的值进行调用random.sample()

下面举三个简化的例子来说明:

random.seed(42)
idxT = [0,1,2,3,4,5,6]
for _ in range(2):
    for _ in range(3):
        print(random.sample(idxT, 3))
    print()
Run Code Online (Sandbox Code Playgroud)

输出:

[5, 0, 6]
[5, 2, 1]
[1, 6, 0]

[5, 6, 4]
[0, 4, 3]
[0, 6, 5]
Run Code Online (Sandbox Code Playgroud)
idxT = [0,1,2,3,4,5,6]
for _ in range(2):
    random.seed(42)
    for _ in range(3):
        print(random.sample(idxT, 3))
    print()
Run Code Online (Sandbox Code Playgroud)

输出:

[5, 0, 6]
[5, 2, 1]
[1, 6, 0]

[5, 0, 6]
[5, 2, 1]
[1, 6, 0]
Run Code Online (Sandbox Code Playgroud)
idxT = [0,1,2,3,4,5,6]
for _ in range(2):
    for _ in range(3):
        random.seed(42)
        print(random.sample(idxT, 3))
    print()
Run Code Online (Sandbox Code Playgroud)

输出:

[5, 0, 6]
[5, 0, 6]
[5, 0, 6]

[5, 0, 6]
[5, 0, 6]
[5, 0, 6]
Run Code Online (Sandbox Code Playgroud)