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