為什麼這段代碼輸出的是 」Hello World」
(點擊
上方公眾號
,可快速關注)
來源: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技能


※JDBC 性能小貼
※Spring Converter 入門之字元串轉化為枚舉
TAG:ImportNew |