在java中生成带有约束的随机顺序

在java中生成带有约束的随机顺序,java,sequence,Java,Sequence,当我放置一个整数列表时,如何生成另一个带有约束的随机顺序 例如,我将整数1、2、3、4放入集合中,当我尝试打印结果时,如“1234”、“1243”、“1234”、“1234”或“211433”(1必须在3之前,2必须在4之前) 预先感谢 < P >你可以考虑的是随机交换元素。您可以在集合中选择一个随机位置,然后将该位置的元素与下一个元素交换。这样,可以防止将1与3或2与4交换。您可以重复执行此操作,直到数字被正确置乱: [1,2,3,4]随机数为0,与位置1处的元素交换 [2,1,3,4]随机数

当我放置一个整数列表时,如何生成另一个带有约束的随机顺序

例如,我将整数1、2、3、4放入集合中,当我尝试打印结果时,如“1234”、“1243”、“1234”、“1234”或“211433”(1必须在3之前,2必须在4之前)


预先感谢

< P >你可以考虑的是随机交换元素。您可以在集合中选择一个随机位置,然后将该位置的元素与下一个元素交换。这样,可以防止将1与3或2与4交换。您可以重复执行此操作,直到数字被正确置乱:

[1,2,3,4]
随机数为0,与位置1处的元素交换

[2,1,3,4]
随机数为1,与位置2处的元素交换

元素是1和3,所以不要交换

if(7==5+2)continue; // ie don't swap.
[2,1,3,4]
随机数为2,与位置3处的元素交换

[2,1,4,3]

如果您想泛化约束,只需更改条件即可。当元素为1和3,或2和4(如上面的示例中所示)时,您可以确保要交换的位置处的两个元素彼此之间的距离不在2以内,因此类似于
if(b==a+2)的情况继续

元素是5和7,所以不要交换

if(7==5+2)continue; // ie don't swap.

如果将其用作字符串,则可以使用answer的算法交换所有数字

输入所有数字后,只需将它们连接在一起。没有必要将它们视为数字或字符串。你所要做的就是重新排列它们

得到结果后,您可以检查约束是否匹配,然后打印另一个列表。也许是这样的

private boolean isConstraintSatisfied(String wholeString, String firstNum, String secondNum){
    return wholeString.indexOf(firstNum) <= wholeString.indexOf(secondNum);
}
private boolean isconstraintsatified(字符串整串、字符串firstNum、字符串secondNum){

return whisttring.indexOf(firstNum)这里定义的是a。您希望生成一个仍然满足偏序的随机排列,即随机线性扩展

幸运的是,JavaAPI指定了,它实现了Fisher-Yates算法来生成随机排列。 不幸的是,标准的Java技术via是一种比较排序,因此它关注的是总的顺序,而不是我们想要的部分顺序。事实上,Java API缺少我们可以在这里使用的排序算法


一个方法涉及到用哈桑的方法来替换集合中的相邻元素。这似乎是一个解决局部问题的有效方法。

为什么C++标签?除非你想要的是纯算法。但是,无论如何你必须设置规则,即使你创建了最好的IA,也就是自动DEDU。C++是C++的C++语言,这是一个规则。谢谢你的提醒,我觉得java和C++是相似的,也许C++中的某个人可以帮助我。我在java和C++中都有代码,所以相信我,它们非常非常不同。时间互换1将在3之后进行,或2将在3之后进行4@bli我不明白你的意思。你能详细说明一下吗?编辑完成后,非常感谢。问题是:我有一个序列,例如:1 2 3 4,我需要用约束概括所有序列(我必须在I+2之前):例如1必须在3之前,2必须在3之前4@bli我编辑了我的答案,但我不知道这是否对你有帮助。这是你想要的吗?