我有一个元组列表,我想要一个函数,在这个列表中随机选择两个元组然后交换这两个元组。
例如,如果我有一个列表为((0,0),(1,0),(1,1),(1,2),(2,2),(0,2)),然后,随机选择两个元组。如果选择(0,0)和(1,0),则该函数的返回结果为((1,0),(0,0),(1,1),(1,2),( 2,2),(0,2))。
我是SML的新手,我在努力奋斗。有一个psudo代码,我想这是不对的,任何人都可以帮助我正确的? :
fun permutation(lst:(int*int) list)=
let
val nextInt = Random.randRange (1,List.length(lst))
val r = Random.rand (1,1)
val x1 = nextInt r
val x2 = nextInt r
val temp = sub(lst,r1)
update(lst,r1,sub(lst,r2))
update(lst,r2,temp)
in
lst
end
答案 0 :(得分:0)
你可以做的简单的事情就是创建一个带有两个索引和一个列表的辅助函数,并在这些索引处返回两个元组。像
这样的东西fun get_two (i1, i2, xs) =
let
fun aux (_, _, [], _, val1, val2) = (val1, val2)
| aux (i1, i2, x::xs, current_index, val1, val2) =
if i1 = current_index
then aux (i1, i2, xs, current_index + 1, SOME x, val2)
else if i2 = current_index
then aux (i1, i2, xs, current_index + 1, val1, SOME x)
else aux (i1, i2, xs, current_index + 1, val1, val2)
in
aux (i1, i2, xs, 0, NONE, NONE)
end
然后编写另一个接受列表的函数,使用此get_two辅助函数在列表中查找两个值及其位置,并生成一个与输入列表相同的新列表,除非切换了这两个值。