在元素删除上可交换的混洗算法?

时间:2014-12-06 00:35:10

标签: algorithm shuffle

对于我正在编写的应用程序(使用函数式语言),我想实现一个确定性的混洗算法,以便给定相同的种子,它将返回相同的混洗数组,并将位置X处的某个元素删除为它会让元素首先没有出现在数组中。示例:如果shuffle([1,2,3,4,5], seed) = [4,2,3,1,5],则shuffle([1,3,4,5], seed)应返回[4,3,1,5]。但在我尝试重新发明轮子之前,我必须问:这样的算法是否存在? (还想知道这个属性是否有一些名字)。感谢您的任何意见。

2 个答案:

答案 0 :(得分:2)

如果你的shuffle产生原始列表或反转列表(取决于种子),它将具有你描述的属性。当与其相应的改组相匹配时,任何其他的,而不是所有的子列表都将使元素以相同的方式移动。例如,考虑shuffle([1,2,3])。在下表中,每列都是不同的随机播放;对于每种情况,3个子列表中的一个有一个shuffle,它以不同于其他两个元素的方式移动元素。

shuffle([1,2,3])  = [1,3,2]  [2,1,3]  [2,3,1]  [3,1,2]
shuffle([1,2])    = [1,2]    [2,1]*   [2,1]    [1,2]*
shuffle([1,3])    = [1,3]    [1,3]    [3,1]    [3,1]
shuffle([2,3])    = [3,2]*   [2,3]    [2,3]*   [3,2]

答案 1 :(得分:0)

假设没有重复值,您可以按pseudorandom function下的值对其进行排序,例如HMAC