簡體   English   中英

生成隨機順序,但在Java中有約束

[英]generate random order but with constraint in java

當我放置一個整數列表時,如何生成另一個具有約束的隨機順序?

例如,我將整數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之前)

提前致謝

您可以考慮的一件事是隨機交換元素。 您可以在集合中選擇一個隨機位置,然后將該位置中的元素與下一個元素交換。 這樣,您可以防止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]

如果您想概括約束,則只需更改條件即可。 您可以確保要交換位置上的兩個元素彼此之間不在2個之內,而不是在元素分別為1和3或2和4時拒絕交換(如上例所示)。 if(b==a+2)continue;

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

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

如果將其用作字符串,則可以使用答案的算法交換所有數字

輸入所有數字后,只需將它們連接在一起即可。 無需將它們視為數字或字符串。 您要做的就是重新排序它們。

得到結果后,可以檢查約束條件是否匹配,然后打印出另一個列表。 像這樣的東西

private boolean isConstraintSatisfied(String wholeString, String firstNum, String secondNum){
    return wholeString.indexOf(firstNum) <= wholeString.indexOf(secondNum);
}

不是最優雅的解決方案,但我認為它會起作用。 對於小的輸入集,它應該不會太低效。

您在此處定義的稱為部分訂單 您希望生成一個仍滿足部分順序的隨機排列,即隨機線性擴展。

幸運的是,Java API指定了Collections.shuffle ,它實現了Fisher-Yates算法來生成隨機排列。 不幸的是,通過Collections.sort的標准Java技術是一種比較sort ,因此專注於總訂單-與我們想要的部分訂單不同。 實際上,Java API缺乏我們可以在此處使用的排序算法。

“通過轉置生成Poset的線性擴展”中介紹的一種方法涉及以類似於Hassan解決方案的方式交換集合中的相鄰元素。 這似乎是解決本地化問題的有效方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM