2017-04-17 340 views
-1

我有一個關於Math.ceil()與Java中的Math.random()一起使用的問題,以便從1到x得到數字。Math.random()爲什麼不輸出0?

int number; 
    number = (int) (Math.ceil(0) * 1); 
    System.out.println("number generated was: " + number); 

此代碼將返回0,如預期 - 0 * 0

int randomNumber; 
    do { 
     randomNumber = (int) Math.ceil(Math.random() * 1); 
     System.out.println("Random number generated was: " + randomNumber); 
    }while (randomNumber != 0); 

那爲什麼這將始終返回1?我沒有得到它 - 當訪問Math.random()時,它會顯示:「返回大於或等於到{@code 0.0}且小於{1.0代碼}}的僞隨機{@code double}」

這應該仍然允許的情況下0 * 1.有人可以向我解釋這個嗎?

+0

你的問題與Math.ceil()無關,只是用Math.random()做的。爲了避免混淆,你可以簡化這樣的問題 - >爲什麼Math.random()沒有輸出0? – RajatJ

+0

從理論上講,0到1之間有無限的實數,所以隨機得到其中任何一個的概率實際上是0(當然在編程語言中,這是不正確的,但是這應該讓你明白爲什麼你可能會在該循環結束之前等待一段時間)。 – vefthym

回答

2

雖然可能Math.random()可能會返回零確切地說,它不是特別可能。因此,循環似乎無限期地運行,儘管在某一點它最終會終止。

要了解有多少雙打可他回到通過Math.random()的想法(即有多少雙打也有0和1之間),看看this SO answer,評價數量:

排除非規範化& c,我相信這個數字是2 ** 52的1023倍。

因此,精確打零的機率大約是2^52中的一個。不要屏住呼吸等待這種事情發生。

+0

感謝您的快速回答! 「 –

0

這是javadoc中這樣說:

返回double值與一個積極的跡象,大於或等於 0.0,小於1.0。返回值是從該範圍內以近似均勻分佈僞隨機選擇的。當此 方法首先被調用,它將創建一個新的僞隨機數發生器 ,就好像在表達

所以,是的,它會在某個時間點返回0,並終止loop。但是,由於它是隨機的,因此當它返回0時很難精確地,因此,您的loop可能會在幾次迭代後終止或可能需要一段時間。

+2

'可能需要一段時間... ...在典型的筆記本電腦或臺式機上可能需要幾年時間:-) –