2017-04-11 113 views
-1

我不是很熟悉如何改變Math.random或新的Random()的範圍來生成這樣的雙精度值。我需要能夠在-10到25美分之間產生雙倍的收益(我的計劃涉及金錢,所以我說美分)。另一個單獨的實例會產生90至75美分的隨機雙倍數。我在查找我的答案時看到了這一點:Java:在負雙倍和正雙倍的範圍內生成隨機雙數

double result = Math.random()*(upper - lower)+ lower;

但是,當我將這個想法實現到我的代碼中時,範圍在使用正數和負數之間的範圍時似乎不起作用... 我測試了它的上限爲0.25和更低 - 0.10,但發現它在我做的測試的一個實例中打印了0.3567587946356543。因此,通過這一點,我的結論是,我明明沒有調整正確的範圍內..

請幫助:(

這是使用計算器,所以請去容易對我我第一次,我會如果有什麼我說詳細說明沒有意義..

這是我使用此代碼現有方法:

public double variation(double price){ 
    //formula: (Math.random() * range) + min; where range = max - min 
    //80% of the time returns amount between -10 & 25 cents 
    if(Math.random() > 0.19){ 
     return (Math.random() * 0.35) - 0.10; 
    } 
    //20% of the time returns amount between -75 & 90 cents 
    return (Math.random() * 1.65) - 0.75; 
} 

我知道的方法接受的是雙重價格,它不使用,它是老師的要求,部分採取雙重價格,但忽視其價值。所以請忽略。

+1

你在'upper'和'lower'中有什麼值 - 當它打印出'0.35 ...'時,將這些行作爲代碼片段 – muescha

+0

,然後它來自範圍從-75到20的20%部分 – muescha

+0

你想要2位數的輸出(比如0.17)或者更長的輸出(比如0.11432810481633897) – CodingNinja

回答

0

現在你已經包含在這個問題所有的代碼,所以我的答案更改爲:

當印刷0.3567587946356543則來自於與範圍-.75的20%部分0.90,當第一Math.random()呼叫if(Math.random() > 0.19){變爲假

老答案:

我想你忘記了在較低值負

double upper = 0.25; 
double lower = -0.10; 
double result = Math.random() * (upper - lower) + lower; 
+0

Omg現在我覺得啞巴哈哈!這是有道理的,謝謝你 – Mipha

+0

,如果它解決了你的問題,然後點擊左邊的灰色複選標記 – muescha

1

-1025之間產生,嘗試做: -

Random r = new Random(); 
int d = r.nextInt(35)+1; 
d = d - 10; 
double result = d/100.0; 

一個襯墊

double result = ((r.nextInt(35)+1)-10)/100.0; 
+0

我需要生成一個雙精度值,而不是一個整數。 -10美分爲-0.10和25美分的較低範圍,在這種情況下爲0.25的上限範圍 – Mipha

+0

@SamanthaHallcox只是將該值分開。檢查我的編輯。 –

+0

啊,我明白了。所以只需確認一下,r.nextInt()會隨機選擇0到35之間的整數? – Mipha

0

爲了得到一個輸出與長十進制: 它有點粗糙,但它完成了工作。

Random rand = new Random();// creates 'Random' method 
int number = rand.nextInt(35)+1;// gets a random integer out of 35 
double randDouble = rand.nextDouble();//gets a random double 
double finalNumber = ((number + randDouble)-10)/100;//adds the integer and the double, 
                //subtracts ten, and divides by 100 
System.out.println(finalNumber);// prints the number 

以下是一些輸出示例(完全複製和粘貼)。

  • 0.22748959958842008
  • 0.1963085030978741
  • 0.17300671109908058
  • -0.002656673961685705
  • -0。08854411636457332
  • 0.03578255664449403

爲了得到一個輸出以兩位數輸出:

Random rand = new Random(); // creates 'Random' method 
    float x = rand.nextInt(35)+1; // gets a random integer(0 through 35) 
    float y = x - 10; // subtracts that number by ten(making the new range -10 through 25) 
    float z = y/100; // puts number in decimal form 

注意此行int number = rand.nextInt(35)+1(在長的十進制版本)。你必須在年底做+1的原因是因爲Java的理解1爲0。見下面

JAVA |0 1 2 3 4 5 
-------|----------- 
HUMANS |1 2 3 4 5 6 
+0

這不會產生負面價值。 –

+0

對不起,我無意中發佈了它沒有完成。讓我快速編輯它。 – CodingNinja

+0

它現在生成負值。對於那個很抱歉! – CodingNinja

0

圖表您的公式實際上是正確的:

double result = Math.random() * (upper - lower) + lower;

您可以通過測試把最小和最大可能的隨機數(這是零,1)

Random Value | Result 
--------------------------- 
0   | -0.1 (lower) 
1   | 0.25 
0.5   | 0.075 
0.01   | -0.0965 

回去得到結果的隨機值爲0.356758795Math.random()必須返回1.305025128這不會是這種情況。 :)

話雖如此,Apache Commons3有這個漂亮的方法RandomUtils.nextDouble(double startInclusive, double endInclusive);它爲你做。

+0

但是,這是事情,我需要的結果是介於-0.10和0.25之間。我是一個初學java的老實說,所以我不確定Apache Commons3是什麼哈哈(假設它與java有關) – Mipha

+0

對不起,我編輯了Apache Commons3的代碼 - 它實際上包含在兩者中結束。 :)你的公式其實是正確的 - 我試着把隨機的最小和最大值:) – Gabe

+0

沒關係!謝謝你的反饋! – Mipha