algorithm - 洗牌数组的最佳算法

标签 algorithm random permutation shuffle

我有一个数组 s = {'ACA','BBC','CKA',...};

我想洗牌s。所以我创建列表 A={1,2,3,4..} 和列表 B={1,2,3,4,...}

然后,我将两个列表打乱。 随机洗牌(A) 随机.shuffle(B)

最后,我将 s[A[0]] 与 s[B[0]] 交换,将 s[A[1]] 与 s[B[1]] 交换......

此算法是否会生成 s 的随机排列?够随意吗?假设 random.shuffle 产生足够随机的 A 和 B 排列。

最佳答案

要使用带有索引数组的 Fisher--Yates (Knuth) 洗牌,初始化单个索引数组 A 就像

for (int i = 0; i < n; i++) A[i] = /* random integer in 0..i */;

然后像这样交换

for (int i = 0; i < n; i++) swap(&s[A[i]], &s[i]);

您的算法不会生成统一的随机排列。当n=2时,A和B的可能性为

A = {0, 1}; B = {0, 1};
A = {0, 1}; B = {1, 0};
A = {1, 0}; B = {0, 1};
A = {1, 0}; B = {1, 0};

这些都不会对起始排列产生任何影响;要么两个元素相互交换,要么相同的重要交换重复两次,取消其效果。

关于algorithm - 洗牌数组的最佳算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199394/

相关文章:

algorithm - 优化算法来安排具有依赖性的任务?

algorithm - 我在哪里可以了解如何以数学方式为 HTML5 Canvas 表示液体?

algorithm - 从一组列表中有效地找到重叠的片段

multithreading - 具有信号量和伪随机数的概念多线程

python - 同一列中所有可能的排列列 Pandas Dataframe

algorithm - 图中的所有链

Python:随机种子问题

ruby - 具有 AES 计数器模式的随机数生成器 - Ruby

r - 在 R 中生成列表的所有不同排列

python - 为什么 Python 的 itertools.permutations 包含重复项? (当原始列表有重复时)