在 Python (CPython) 中进行不可变洗牌的内置方法?

Built-in way to do immutable shuffle in Python (CPython)?

random.shuffle() 内置随机播放,适用于多种用途。但是假设我们想要完整地保留原始集合,并根据原始序列生成随机排列,在标准库中是否有更好的方法来做到这一点?

当我查看 CPython's random.py 时,我看到一条初始评论:

sequences
    ---------
           pick random element
           pick random sample
           pick weighted random sample
           generate random permutation

特别是最后一行很有趣。但是,我很难看到这个 class 中的什么方法实现了这一点。

当然,这不是一个很难解决的问题,即使对于新手 Python 程序员也是如此。但是在标准库中有一个标准的方法来做这件事会很好,我相信它一定存在于某个地方。也许在 random.py 以外的某个地方?

这似乎是一个显而易见的解决方案,不应做不必要的工作:

def shuffled(gen):
    ls = list(gen)
    random.shuffle(ls)
    return ls

由于从 stdlib 基元构建非常简单,我不确定将它作为一个单独的基元包括在内是否有意义。

根据 random.shuffle(), you could use random.sample() 的文档:

To shuffle an immutable sequence and return a new shuffled list, use sample(x, k=len(x)) instead of shuffle().

this post

中分析了同样的事情