2013-10-02 143 views
2

如何使用Math.random()生成兩個隨機數?例如,我試圖從集(2,4,6,8)中生成一個隨機數,你將如何去呢?如何在java中生成隨機數

+2

所以,你不是說「產生'一個隨機數?你只是想從數組中選擇一個隨機索引? – Rohan

回答

5

對於這個特定的設置,你可以使用

(int)(Math.random() * 4) * 2 + 2 

這裏:

  • Math.random()生成一個數字,是大於或等於0.0且嚴格小於1.0;
  • (int)(... * 4)給出一個0,1,2,3,
  • ... * 2 + 2給出一個2,4,6,8,
+0

你假設該集合*總是*那個特定的算術級數。 – hexafraction

+0

@hexafraction:是的。在這個問題上,我沒有看到任何跡象表明OP在這個特定集之外。 – NPE

+0

@hexafraction *「二進制數字」* – arshajii

0
int[] numSet={2,4,6,8}; 
Random myRand=new Random(); 
int myNum=numSet[myRand.nextInt(numSet.length)]; 

這產生數字的陣列,所述隨機對象然後從數組數組中選取一個隨機元素。這並不假定這些數字是以任何形式的數學系列。他們可能是11,25,31,876,984368,7432,84562就此而言。

請不要告訴我,有一個多項式從它的y值生成該集合。我知道。

+0

如果該集合達到100萬,該怎麼辦?您必須將所有數字不必要地存儲在數組中。 – arshajii

+0

@arshajii鑑於當前原始問題的模糊性,所有答案都會部分正確,部分不可行,因爲我們不知道OP的參數。 AFAICT有一個5分鐘的窗口編輯,但我不能太確定。 – hexafraction

+0

這裏有一個小小的危險,有人會逐字複製這段代碼,並且爲每個新選擇創建一個新的Random()對象比來自同一個Random對象的連續值「隨機」要少得多。儘管如此,如果編碼人員仔細創建該對象一次,並將其重複用於多次調用或迭代(如果僅僅因爲它更可能是線程安全的),那麼它會更好。 –

0

將這些數字放在數組中。 使用數組長度 - 1生成一個隨機數,並將其用作隨機選擇數組元素的索引。

0

您也可以使用了java.util.Random類是這樣的:

int values[] = {2,4,6,8}; 
    Random randomGenerator = new Random(); 
    int randomInt = randomGenerator.nextInt(values.length); 
    int randomValue = values[randomInt]; /* Here's your random value from your set */ 
2

好吧,讓我們做一個真正的通用解決方案。

int lower = 2; 
int upper = 8; 
int step = 2; 
int rand = (int)(Math.random() * (upper-lower+1)); 
int result = rand - rand%step + lower; 

如果您想要在另一個集合內生成的數字不是您指定的數字,只需更改較低,較高和較高的變量以適應您的設置。它包括上限,如果它在集合中。

+1

您需要該表達式中的(上 - 下+ 2)周圍的parens。此外,您可以使用(rand&-2)來執行沒有除法的(rand - rand%2)。如果你想離開該部門,你可以得到一個更一般的解決方案,任何算術級數可以用(上),(下)和(指定常見差異的(步)值來描述。 –

+0

謝謝,相應地修復它。 – spydon

+0

已經足夠用於upvote了。 :)我還注意到,你正確地改變了(上 - 下+ 2)到(上 - 下+ 1)以允許1的步驟。幹得好! –

0

我想添加一個更一般的答案。

假設在一套最小的整數A和集合的大小S.從一組隨機整數會是這樣的:

A + myRandom.nextInt(S) * 2 

對於Java中的具體的例子,這將是:

Random myRandom = new Random(); 
int randomNum = 2 + myRandom.nextInt(4) * 2; 
1

(幾乎)完全一般的方法並不難。

static randInt(int first, int last, int step) { 
    int nsteps = (last+1-first)/step; 
    return first + step*(int)(nsteps*Math.random()); 
} 

返回從{start, start+step, start+2*step, ... }至多且包括stop,或者最後一個號碼stop如果stop之前不是序列的一部分的隨機整數。

int choice = randInt(2, 8, 2); /* random choice from {2, 4, 6, 8} */ 

...解決了示例問題。

的(幾乎)的部分是,這不處理整數溢出或參數簽名錯誤(step爲零,step<0first<last,反之亦然。)