我有一个函数,为了简单起见,我将它命名为shuffler,它接受一个列表,给随机一个种子17,然后打印这个列表。
def shuffler( n ):
import random
random.seed( 17 )
print( random.shuffle( n ) )假设我知道种子,我如何创建另一个名为unshuffler的函数来“反洗牌”由shuffler()返回的列表,并将其返回到我输入到shuffler()中的列表?
发布于 2021-09-01 09:14:50
我只是想提供一个与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))发布于 2017-02-18 00:09:42
这里有两个函数可以满足您的需求:
import random
import numpy as np
def shuffle_forward(l):
order = range(len(l)); random.shuffle(order)
return list(np.array(l)[order]), order
def shuffle_backward(l, order):
l_out = [0] * len(l)
for i, j in enumerate(order):
l_out[j] = l[i]
return l_out示例
l = range(10000); random.shuffle(l)
l_shuf, order = shuffle_forward(l)
l_unshuffled = shuffle_backward(l_shuf, order)
print l == l_unshuffled
#True发布于 2014-10-27 04:40:34
用有问题的种子重新设定随机生成器的种子,然后打乱列表1,2,...,n。这会准确地告诉你在打乱中什么东西结束了。
https://stackoverflow.com/questions/26577517
复制相似问题