2011-08-28 117 views
1

我要生成的隨機整數,它是:從最小到最大生成隨機整數?

  1. 裏面的範圍[最小值,最大值] inclusive
  2. 範圍可以是[5,20],[-29,-3]或[ - 13,13](它可以在任何範圍內,積極或消極或之間)
  3. 代碼採用的是Android

工作正常,我得到了什麼,到目前爲止是這樣的,但它似乎不是消極工作範圍!

1 + (int)(Math.random() * ((Max - Min) + 1)); 
+2

你[-3,-29]在錯誤的位置,如果你說[最大,最大], – doNotCheckMyBlog

+0

可能重複的[Java:生成範圍內的隨機數](http://stackoverflow.com/questions/363681/java-generating-random-number-in-a range) –

+0

我沒有投票,但代碼仍然不正確,修正了這個問題。另外,'[5,-13]'也是錯誤的。 –

回答

10

我敢肯定你想

Min+(int)(Math.random()*((Max-Min) + 1)); 

不過,我要指出的是,範圍[-3,-29]有它的最小和最大逆轉。 (和相同的[5,-13]作爲被Merlyn指出。)

如果你想只是把任意兩個號碼的範圍,a和b然後使用代碼

int Min = Math.min(a,b); 
int Max = Math.max(a,b); 

這樣你就不必擔心訂單了。這甚至可以用於== b。

+0

與[5,-13]相同' –

+0

好的。我沒有注意到這一點。 –

+0

已更新!...... – iTurki

1

試試這個

int min = -100; 
int max = 100; 
Random rand = new Random(); 
return rand.nextInt(max - min + 1) + min; 
1

有沒有人提到,他的最小和最大反轉?因爲這就是搞砸他的代碼。

編輯

多數民衆贊成搞亂了他的代碼的另一件事情:它應該是Min +1 +

+0

假設它不是 – iTurki

+0

它已被提及,但不,這不是什麼搞砸他的代碼。 –

+0

編輯添加實際有用的建議,而不是snark。因爲這是週末。 – Malvolio

1
/** 
* @param bound1 an inclusive upper or lower bound 
* @param bound2 an inclusive lower or upper bound 
* @return a uniformly distributed pseudo-random number in the range. 
*/ 
public static int randomInRange(int bound1, int bound2) { 
    int min = Math.min(bound1, bound2); 
    int max = Math.max(bound1, bound2); 
    return min + (int)(Math.random() * (max - min + 1)); 
} 

如果呼叫者可以保證bound1將小於或等於bound2比你可以跳過確定最小和最大範圍的步驟;例如

/** 
* @param min the inclusive lower bound 
* @param max the inclusive upper bound 
* @return a uniformly distributed pseudo-random number in the range. 
*/ 
public static int randomInRange(int min, int max) { 
    return min + (int)(Math.random() * (max - min + 1)); 
} 

我還沒有在Android測試這一點,但它應該是支持符合那些方法標準(星期日)的Java SE規格任何Java或類似Java的平臺上工作。

0

只需將計算最小和最大 例-30和30 之間的差來獲得: 增量< - 的絕對值(30 - ( - 30)) 然後找到0和delta之間的隨機數。

有與此相關的已經是一個職位。 事後你常分鐘翻譯沿着號線的數量。

如果使用Random類: 1)添加到這裏隨機方程。nextInt(someInt),因爲nextInt返回: someVal < someInt所以您需要確保在函數輸出中包含邊界。

一些關於這些代碼讓我謹慎:

return min + 
(int)(Math.random() * (max - min + 1)); 
} 

當鑄造四捨五入雙打轉換爲整數:

int someRandomDoubleRoundedToInteger = (int)(someDouble + 0.5) 

是否行得通?這是爲了我的好處,也許其他一些新手會很開心,或者我犯了一個錯誤:

讓我們選擇1和10開始。 選擇一個數字1和10(含)我挑選10名

的Math.random不包含0和1之間,以便0.9999999999999999 *(10 - 1 + 1)= 9.999999999999999鑄造爲int,所以小數產生後吊球關閉一切9,我們添加1〜9 10(使用隨機從東西(1.9至0.999999999999)返回還將生產10

我想選擇1 1和10

之間。在這種情況下,隨機方法把它的最接近零值說出來: 0.00000000000000001 *(10 - 1 + 1)強制轉換爲int 0我們返回1 + 0,這樣就可以工作

嗯,似乎工作。看起來像是對1的非常非常小的偏見,因爲我們從不包括「0」作爲可能性,但它應該是可以接受的。

如果隨機生成器均勻地覆蓋0和1之間的整個區域,則該方法有效。 {0,1}區間之間可以表示多少個不同的數字,它們是均勻間隔的嗎?

我認爲它的工作原理。

相關問題