(點選上方公眾號,可快速關註)
來源:ImportNew – 黃小非
Stackoverlfow.com上有一篇有趣的討論帖:
http://stackoverflow.com/questions/15182496/why-does-this-code-print-hello-world
在這篇帖子裡提到瞭如下的程式:
import java.util.*;
public class HelloWorld{
public static String randomString(int i)
{
Random ran = new Random(i);
StringBuilder sb = new StringBuilder();
for (int n = 0; ; n++)
{
int k = ran.nextInt(27);
if (k == 0)
break;
sb.append((char)(‘`’ + k));
}
return sb.toString();
}
public static void main(String[] args){
System.out.println(randomString(-229985452)+” “+randomString(-147909649));
}
}
明明是在程式裡使用了java.util.Ramdom()函式產生隨機數,為什麼每次打出的結果都是Hello world? 各位程式員,你們怎麼看?請務必要獨立思考後再看下麵的內容哦~
—————–獨立思考的分割線—————————
OK,假如你透過獨立思考了以後有了答案,那麼可以參照一下下麵的各種理解,這些都是來自stackoverflow對此問題的回覆。
首先看一下這個程式的工作原理:
透過這句命令首先得到的六個數是:
8 5 12 12 15 0
然後,透過new Random(-147909649).nextInt(27)得到的6個數是:
23 15 18 12 4 0
這樣一來,根據:sb.append((char) (‘`’+n)); 得到:
8 + 96 = 104 –> h
5 + 96 = 101 –> e
12 + 96 = 108 –> l
12 + 96 = 108 –> l
15 + 96 = 111 –> o
23 + 96 = 119 –> w
15 + 96 = 111 –> o
18 + 96 = 114 –> r
12 + 96 = 108 –> l
4 + 96 = 100 –> d
整個程式的執行就是這樣。
關於這個程式的執行原理的解釋,最置頂的一個回覆如下:
“如果java.util.Random是被一個具體的數字做為“隨機數種子”而實體化(在本例中是-229985452和-147909649),那麼該實體就會以這個隨機數種子作為隨機演演算法產生隨機數的基礎。
使用同樣的種子實體化的Random物件,每次執行時將會遵循同一種樣式,產生同樣的序列。”
這就是為什麼每次執行該程式都會產生同樣的結果的原理啦~
當然,關於這個話題,高手林立的Stackoverflow上是不缺乏懂行的專家和見解的。其實對於這個帖子本身,很快就有人論壇上提出了,這不是一個新鮮的問題,之前的某個帖子已經很詳細地說明瞭原理:
參見:
stackoverflow.com/questions/8044570/why-does-the-use-of-random-with-a-hardcoded-seed-always-produce-the-same-results
還有的人就非常精闢地指出了,這是計算機所謂的“偽隨機數”問題(詳細見擴充套件閱讀),更有部分Geek的回覆者從計算機理論和機率論的角度說明瞭,應該如何找到這些神奇的“隨機數種子”。能夠把這麼一個原意為搞笑的帖子發展到理論的高度~,相信這應該也是電腦科學家的境界和覺悟了吧!
擴充套件閱讀:計算機偽隨機數問題
隨機數在電腦科學和計算機應用中都扮演非常重要的角色(例如通訊、安全、密碼等方面)。但是,由於計算機本身的結構和原理,實際上是無法產生出所謂的“絕對隨機數”的。也就是說,計算機所產生的隨機數,實際上是有某種規律或者樣式的“偽隨機數”(Pseudo random number)。
如何用計算機程式產生高質量隨機數,這是計算機理論科學中的一個非常重要的課題。尤其是在複雜的計算環境下的高質量隨機數的產生,需要牽涉到非常高深的計算科學和數學方面的理論研究。
姚期智,美籍電腦科學家,2000年因對計算機偽隨機數產生等研究獲ACM圖靈獎
在計算機隨機數產生的理論研究上,美籍華人姚期智(目前任職於清華大學)是世界頂尖的專家。正是因為他在計算理論和偽隨機數產生方面多項貢獻,於2000年獲得了ACM圖靈獎,這也是電腦科學領域的最高獎項。
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能