2016-06-26 58 views
-2

我必須爲ArrayList中的52000個實例生成兩個隨機數,攻擊1和攻擊2,攻擊1必須大於攻擊2,所以我必須將它們放入列表中。這是我的示例代碼:隨機數和while循環問題

do { 
    atk_p1 = (int) (Math.random() * (5000-500+1)+500); 
    atk_p2 = (int) (Math.random() * (5000-500+1)+500); 
} while(atk_p1 <= atk_p2); 

data.add(String.valueOf(atk_p1)); 
data.add(String.valueOf(atk_p2)); 

我的問題是,上面的代碼,有時作品(因此atk_p1大於atk_p2),但其他時間沒有(因此atk_p2大於atk_p1)。我試圖解決這個問題。感謝您的幫助。

上面的代碼是Java。

+1

這是什麼編程語言?請使用該信息更新問題並添加適當的標籤。 – Kusalananda

+0

爲什麼不生成第一個數字作爲上限的第二個數字,從而否定了do ... while循環的需要? –

+0

在文中,你一直說「大於」,但是在你寫的「大於或等於」的代碼中。你的意思是哪一個。 – Kusalananda

回答

0

如果你想生成兩個隨機數,ab,這樣a < b,然後

  1. 生成a
  2. 生成ba加上一個大於零的隨機數。

編輯:這是錯誤的,我承認它。見下面的評論。 Mea culpa。

+0

如果這打破了有效b的上限呢? –

+0

@BillWoodger你知道'a',你知道你的上限'm',然後'b = a + 1(r%(m-a-1))',其中'r'是一個隨機數。 「+ 1」和「-1」是嚴格不平等所必需的。我仍然不知道這是什麼語言,所以我不知道'random()'thingy返回的是什麼。 – Kusalananda

+0

假設生成的隨機數的上邊界有一定的限制,那麼+一些新的隨機數可以打破這個。我不知道你的代數是證明還是反駁,但它是如此。請參閱SilverWarrior的答案。 –

0

我只想生成與第一個第二個隨機數,因爲它的上限:

atk_p1 = (int) (Math.random() * (5000-500+1)+501); 
atk_p2 = (int) (Math.random() * (atk_p1)+500); 

data.add(String.valueOf(atk_p1)); 
data.add(String.valueOf(atk_p2)); 
2

另一種方法是產生ab,然後做簡單的對比檢查,看是否b小於a

如果不是,您只需將其替換爲ab

+0

對不起,這沒有出現在我的手機上。包括什麼時候平等的位(不必有彩票的東西),我會刪除我的。我看不到一個更簡單的解決方案,並且與語言無關。 –

0

我解決了這種方式:

int atk_p1 = 0; 
    int atk_p2 = 0; 

    data.add(String.valueOf(atk_p1)); 
    data.add(String.valueOf(atk_p2)); 

    do{ 
    atk_p1 = (int) (Math.random() * (5000-500+1)+500); 
    atk_p2 = (int) (Math.random() * (5000-500+1)+500); 
    }while(atk_p1 == atk_p2); 


    if(atk_p1 > atk_p2){ 
    data.set(34, String.valueOf(atk_p1)); 
    data.set(36, String.valueOf(atk_p2)); 
    }else{ 
    data.set(34, String.valueOf(atk_p2)); 
    data.set(36, String.valueOf(atk_p1)); 
    } 

問題是arraylist.add()操作,不嚴格,以指令的順序。使用索引來指定將信息放在哪裏很好。