algorithm - 模糊的项目列表 - 打乱顺序,但顺序严格

标签 algorithm sorting random shuffle

我有一个问题列表,我需要以不同的格式呈现每个问题。

(N 个项目的列表,每个项目有 M 种可能的排列)。

例如

questions = [a, b, c]
permutations = [x, y]
permuted_questions = [(a,x), (b,x), (c,x), (a,y), (b,y), (c,y)]

像上面那样生成一个简单的排列列表很简单。然而, 为了使列表更“有趣”,我想以某种方式对其进行洗牌。

问题在于排列列表是严格有序的。即对于给定的项目 a,排列 (a,x) 应该总是出现在排列 (a,y) 之前。

例如

[(a,x), (b,x), (a,y), (c,x), (b,y), (c,y)] 是有效的洗牌

[(a,x), (b,y), (a,y), (c,x), (b,x), (c,y)] 无效,因为 (b,y) 出现在 (b,x)

之前

有什么建议吗?

最佳答案

您可以简单地将问题打乱成任意排列,然后通过标记第一个“a”问题 x 和第二个“a”问题 y 来对列表进行后处理,对于其他类型的问题依此类推。

例如:

Construct shuffle:
    (a,x), (b,y), (a,y), (c,x), (b,x), (c,y)

Turn into valid shuffle:
    (a,x), (b,x), (a,y), (c,x), (b,y), (c,y)

示例 Python 代码:

from random import shuffle
from itertools import product
from collections import defaultdict
questions = ['a', 'b', 'c']
permutations = ['x', 'y']
Q = list(product(questions,permutations))
shuffle(Q)
D = defaultdict(int) # Keep track of permutation to use for each question
C = []
for q,p in Q:
    C.append( (q,permutations[D[q]]) )
    D[q] += 1
print C

关于algorithm - 模糊的项目列表 - 打乱顺序,但顺序严格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34062885/

相关文章:

c# - 结构化顺序处理的最佳设计模式

algorithm - o(1) 中是否有任何函数?

java - 如何在两个不同点之间绘制移动动画线

c - 为文件添加不重复的随机文本 (C)

c# - PermCheck codility。 O(N) 时间复杂度

c++ - merge_sort什么时候打败quick_sort?

javascript - 根据搜索词的相关性对多个 JavaScript 数组进行合并和排序

Python:中位数为三的快速排序

linux - 想使用排序命令在此时间戳 2019-06-29T12 :39:23. 428Z 上对我的日志文件进行排序,但由于有多个定界符而感到困惑

mysql - 在MySQL中以一定的机会(权重)选择随机行