random.shuffle() 的倒数?

Tet*_*ed_ 9 python random python-3.x

我有一个函数,为简单起见,我将其称为 shuffler,它需要一个列表,随机给出一个种子 17,然后打印该列表。

def shuffler( n ):
   import random
   random.seed( 17 )
   print( random.shuffle( n ) )
Run Code Online (Sandbox Code Playgroud)

我将如何创建另一个名为 unshuffler 的函数,该函数“解混”由 shuffler() 返回的列表,假设我知道种子,将其带回到我输入到 shuffler() 的列表中?

小智 8

只是想贡献一个与 numpy 常用的功能模式更兼容的答案。最终,这个解决方案应该执行得最快,因为它将利用 numpy 的内部优化,而内部优化本身可以通过使用numba等项目来进一步优化。它应该比在 python 中使用传统的循环结构快得多

import numpy as np

original_data = np.array([23, 44, 55, 19, 500, 201]) # Some random numbers to represent the original data to be shuffled
data_length = original_data.shape[0]

# Here we create an array of shuffled indices
shuf_order = np.arange(data_length)
np.random.shuffle(shuf_order)

shuffled_data = original_data[shuf_order] # Shuffle the original data

# Create an inverse of the shuffled index array (to reverse the shuffling operation, or to "unshuffle")
unshuf_order = np.zeros_like(shuf_order)
unshuf_order[shuf_order] = np.arange(data_length)

unshuffled_data = shuffled_data[unshuf_order] # Unshuffle the shuffled data

print(f"original_data: {original_data}")
print(f"shuffled_data: {shuffled_data}")
print(f"unshuffled_data: {unshuffled_data}")

assert np.all(np.equal(unshuffled_data, original_data))
Run Code Online (Sandbox Code Playgroud)


Dar*_*zka 2

使用有问题的种子重新播种随机生成器,然后对列表 1, 2, ..., n 进行混洗。这准确地告诉您洗牌中最终发生了什么。