2014-02-21 81 views
1

我的問題在概念中非常簡單: 我有一個24個布爾值的數組,我最初都將其設置爲false。我可以隨機選擇這個數組的代碼的元素:如何從不同的元素中隨機選擇

Random r = new Random(); 
int i1=r.nextInt(24); 

現在從我不時改變一些元素,真正的價值,讓說,單元號碼14和22我怎麼能現在選擇隨機地只在其他仍然是假的元素之間,而不是認爲那些是真的?預先感謝您的答案。

編輯: 誰的作品的代碼是:

Random r = new Random(); 
int rand = r.nextInt (24); 

while (array[rand]) { 
      rand = r.nextInt (24); 

     } 
+0

僞代碼 - 'do(獲取隨機數組元素)while (random element == true)' – csmckelvey

回答

0
int numberTrue=0; //adjust this in your other code accordingly 
Random r = new Random(); 
int rand = r.nextInt (24); 
// loop until not true found or stop if all items are true 
while (array [rand] && numberTrue < 24) { 
    rand = r.nextInt (24); 
    count++; 
} 

我思考了一下,沒有在這裏知道你的代碼是一對夫婦的建議,以避免無限循環時,他們都是真實的(假設條件存在):
1.保持(此調整的例子)
2.存儲的真正指標的第二陣列,在對方的回答

首先提出多少真正的設置數量大概是最簡單的實現(加入numberTrue++;numberTrue--;在適當的代碼點) - 只是在這裏注意,如果它是不可能保持這個計數,你可以通過在你的數組上運行一個initial循環並計算true元素的數量來達到同樣的效果。
第二種方法適合以利用來自其他職位的答案之一:

public int generateRandom(int start, int end, ArrayList<Integer> excludeRows) { 
    Random rand = new Random(); 
    int range = end - start + 1; 

    int random = rand.nextInt(range) + 1; 
    while(excludeRows.contains(random)) { 
     random = rand.nextInt(range) + 1; 
    } 

    return random; 
} 

(我相信他們的代碼實際上應rand.nextInt(range) + start
所以,你可以運行:

if (trueIndexes.length < 24) { 
     generateRandom(0, 23, trueIndexes); 
    } 
+0

也是如此,如果你想效率的話,那麼這個從Random中排除一些數字的問題可能會幫助你:http:// stackoverflow。 com/questions/14935997/generate-random-numbers-except-certain-values – Tim

+0

是的,我想我會使用while循環。現在我正在尋找鏈接,這似乎很有用,謝謝 – Ardi

+0

我正在重新查看代碼,也許我沒有低估,但在我看來,它嘗試了24次產生該數字..好吧,如果我有24個機會產生所需的數字,它不意味着,如果我嘗試24次,我一定會生成它...它可能需要5次或20或30或100或更多的時間,因爲是概率 – Ardi

0

您可以跟蹤其中的元素有trueArrayList例如價值指數。當生成一個隨機數時,檢查它是否等於已有的true數字(它應該從隨機數生成/選擇中排除)並重新生成一個隨機數,直到獲得一個數組索引仍處於false

+0

是的,但問題是,當初始數組(我想從中隨機選擇一個)將被24個總元素中的23個元素填充時,在這種情況下,我將隨機選擇23次,直到我發現那個仍然錯誤的人是對的?只是想要更有效率的東西,但如果我找不到其他的東西,那麼解決方案 – Ardi

0

您可以創建具有「假」的布爾元素列表並隨機選擇此列表中的元素。

相關問題