当我输入整数列表时,如何生成另一个随机顺序但有约束?
例如,我将整数1,2,3,4放入集合中,当我尝试打印结果时,如“1 2 3 4”,“1 2 4 3”,“1 3 2 4”,“ 2 1 3 4“,或”2 1 4 3“(1必须在3之前,2之前必须在4之前)
提前致谢
答案 0 :(得分:2)
您可以考虑的一件事是随机交换元素。您可以在集合中选择一个随机位置,然后将该位置的元素与下一个元素交换。通过这种方式,您可以防止将1与3或2与4进行交换。您可以重复执行此操作,直到数字被正确加扰为止:
[1, 2, 3, 4]
随机数为0,与位置1处的元素交换。
[2, 1, 3, 4]
随机数为1,与位置2的元素交换。
元素是1和3,所以不要交换。
[2, 1, 3, 4]
随机数为2,与位置3处的元素交换。
[2, 1, 4, 3]
等。
如果您想概括约束,可以简单地更改条件。当元素是1和3,或者2和4时(如上例所示),你可以确保要交换的位置上的两个元素不在彼此的2之内,而不是拒绝交换,所以像if(b==a+2)continue;
:
元素是5和7,所以不要交换。
if(7==5+2)continue; // ie don't swap.
答案 1 :(得分:0)
如果您将其用作字符串,则可以使用this answer的算法来交换所有数字
当您输入所有数字时,只需将它们连接在一起即可。没有必要将它们视为数字或字符串。你想要做的只是重新排序。
当您得到结果时,您可以检查您的约束是否匹配,然后打印出另一个列表。这样的事可能
private boolean isConstraintSatisfied(String wholeString, String firstNum, String secondNum){
return wholeString.indexOf(firstNum) <= wholeString.indexOf(secondNum);
}
不是最优雅的解决方案,但我认为它会起作用。对于小输入集,它不应该太低效。
答案 2 :(得分:0)
您在此处定义的内容称为partial order。您希望生成一个仍然满足偏序的随机排列,即随机线性扩展。
幸运的是,Java API指定了Collections.shuffle
,它实现了Fisher-Yates算法以生成随机排列。
不幸的是,通过Collections.sort
的标准Java技术是比较排序,因此专注于总订单 - 与我们想要的部分订单不同。实际上,Java API缺少我们可以在这里使用的排序算法。
"Generating Linear Extensions of Posets by Transpositions"中涉及的一种方法涉及以类似于哈桑解决方案的方式交换集合中的相邻元素。这似乎是解决当前问题的一种有效方式。