1. 基本概念
顧名思義,Math.random()方法就是用於生成隨機數的,因為單詞random的意思正是「隨機的」。該方法生成的結果是 [0, 1) 範圍內的浮點數,注意這是一個左閉右開的區間,即該區間包含0而不包含1。
官方文檔指出Math.random()方法生成的隨機數在該區間上要大致符合均勻分布。Math.random()的語法結構如下所示,可以看出它是沒有參數的。
Math.random();
JavaScript引擎會自動設置隨機數種子(seed),而沒有提供任何途徑讓我們自己來完成這件事,但某些其它語言(比如C++,Java)則通常允許用戶自主設置隨機數種子。
2. 範圍放縮
Math.random()方法的一個不足之處就是它只能隨機生成 [0, 1) 範圍內的數,而我們常常又需要其它範圍內的隨機數。其實這也不難,只要對Math.random()的結果進行適當的放縮就可以達到這一目的。為了敘述方便,在後面的說明中我們都約定n和m代表正整數且m大於n。
首先,假設我們需要隨機生成 [0, n) 之間的所有數,那麼只需將Math.random()的結果乘以n就可以了,正如下面的代碼所做的那樣。
其次,我們可能需要的是隨機生成 [0, n] 範圍內的整數,注意此時n也包含在生成結果中。我們先將Math.random()的結果乘以 n+1,得到 [0, n+1) 範圍內的浮點數。然後,再對該範圍內的數進行向下取整(使用Math.floor()方法)就可以得到 [0, n] 範圍內的整數了。
以上兩種方法生成的隨機數都是從0開始的,如果我們需要的是任意區間的隨機數呢?假設我們需要隨機生成 [n, m] 範圍內的整數,那麼我們先隨機生成 [0, m - n] 範圍內的整數,再將它加上n就可以得到 [n, m] 內的整數了。
用相同的思想,可以將Math.random()的結果放縮到任意區間,當然也包括負數的情況。
3. 示例
3.1 生成隨機數
我們首先來看下Math.random()的作用和隨機生成一個任意區間內的整數的情況,以下代碼的執行結果如圖1所示。
3.2 隨機數的分布
官方文檔中說Math.random()的結果要大致符合均勻分布,我們現在就通過一個實例來看一看。在該例子中,我們先隨機生成1億個 [1, 10] 範圍內的整數,再計算每個數出現的比例。
以上代碼的執行結果如圖2所示,正是因為Math.random()符合均勻分布而我們自定義的隨機數函數又是建立在Math.random()上的,所以我們的隨機數函數生成的隨機數也是均勻分布的。
(完)