摘要:使用來生成隨機數在日常操作中是普遍并且是簡單的。如下上述代碼的作用是生成的隨機數。但是,如果把隨機數改成隨機整數。
使用 Math.random 來生成隨機數在日常操作中是普遍并且是簡單的。如下:
let rnd = Math.random() * 10;
上述代碼的作用是生成 0~10 的隨機數。
那么,這些隨機數是出現的概率是均衡的嗎?
筆者沒辦法直接回答這個問題。因為生成的隨機數個數理論上是一個無窮大的數集,不過,可以按數值大小范圍來估算數值的分布是否平均:
let bucket = new Array(10).fill(0); let res = new Array(500000); // 做50萬次隨機數 for(let i = 0; i < 500000; ++i) { res[i] = Math.random() * 10; // 數值大小規類 let num = res[i]; for(let i = 0; i < 10; ++i) { if(num >= i * .1 && num < (i + 1) * .1) { ++bucket[i]; } } } bucket.forEach( (count, index) => { console.log(index * .1 + "~" + (index + 1) * .1 + "的概率:" + count / 500000) } )
以下是一次輸出結果:
0~0.1的概率:0.010244
0.1~0.2的概率:0.009868
0.2~0.3的概率:0.009744
0.3~0.4的概率:0.010024
0.4~0.5的概率:0.009818
0.5~0.6的概率:0.009814
0.6~0.7的概率:0.010048
0.7~0.8的概率:0.009834
0.8~0.9的概率:0.010154
0.9~1的概率:0.009988
結果顯示 Math.random() * 10 生成的數值分布是比較均衡的。
但是,如果把「隨機數」改成「隨機整數」。代碼改成:
let rnd = Math.round(Math.random() * 10);
上面代碼是生成 0~10 的隨機整數。
那么,這些隨機整數是出現的概率是均衡的嗎?
筆者直觀上覺得是隨機的,但是實際情況并不是!測試代碼如下:
let res = new Array(11).fill(0); // 做一萬次隨機數 for(let i = 0; i < 500000; ++i) { ++res[Math.round(Math.random() * 10)]; } res.forEach((count, index) => console.log(index + "的概率:" + count / 500000))
以下是一次結果:
0的概率:0.050028
1的概率:0.09957
2的概率:0.100616
3的概率:0.099684
4的概率:0.100672
5的概率:0.099588
6的概率:0.100446
7的概率:0.100276
8的概率:0.099664
9的概率:0.099628
10的概率:0.049828
不難發現,0 和 10 的概率是其它數值的一半左右,而其它數值的概率相差無幾。
Math.round 方法是造成「隨機整數」不均衡的原因
Math.round/Math.ceil/Math.floor 這三個函數作用是使一定范圍內的實數轉換成同一個整數。以 Math.round 為例如下:
從上圖可以直觀地看到,頭尾兩數(0&10)的取值范圍是其它整數的一半!
生成隨機均衡整數的一種方案
其實,只需要保證取值范圍的長度一致即可以實現隨機均衡整數。以下是筆者實現的一種方案:
let res = new Array(11).fill(0); // 做一萬次隨機數 for(let i = 0; i < 500000; ++i) { ++res[Math.floor(Math.random() * 11)]; } res.forEach((count, index) => console.log(index + "的概率:" + count / 500000))
以下是一次輸出結果:
0的概率:0.090828
1的概率:0.090988
2的概率:0.09048
3的概率:0.08958
4的概率:0.091516
5的概率:0.090826
6的概率:0.09112
7的概率:0.091668
8的概率:0.090918
9的概率:0.090626
10的概率:0.09145
從結果上看分布是均衡的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90781.html
摘要:即服務提供者目前正在處理的請求數一個請求對應一條連接最少,表明該服務提供者效率高,單位時間內可處理更多的請求。此時應優先將請求分配給該服務提供者。初始情況下,所有服務提供者活躍數均為。 1.簡介 LoadBalance 中文意思為負載均衡,它的職責是將網絡請求,或者其他形式的負載均攤到不同的機器上。避免集群中部分服務器壓力過大,而另一些服務器比較空閑的情況。通過負載均衡,可以讓每臺服務...
摘要:生成隨機數的方案網上有很多,但是在驗證概率的時候卻發現不相同先把這種類型的隨機正整數生成方式貼出來。 生成隨機數的方案網上有很多,但是在驗證概率的時候卻發現不相同先把這4種類型的隨機正整數生成方式貼出來。 ①、// 生成 [n,m),包含n但不包含m的正整數: --?? parseInt(Math.random()*(m-n)+n) ②、// 生成(n,m],不包含n但包含m的正整數:...
摘要:庫就可以方便地生成指定范圍的隨機數字,并且支持指定生成整數或是小數。 NPM酷庫,每天兩分鐘,了解一個流行NPM庫。 昨天,我們了解到 string-random 庫可以用來快速生成指定格式的隨機字符串,今天我們繼續學習如何生成隨機的數字。 其實只需要 Math.random()就可以生成一個隨機數字,但是這個數字大小是0~1,如果我們需要生成一個指定范圍的隨機數字,那么就需要進一步的...
閱讀 3021·2021-11-24 10:32
閱讀 678·2021-11-24 10:19
閱讀 5071·2021-08-11 11:17
閱讀 1456·2019-08-26 13:31
閱讀 1259·2019-08-23 15:15
閱讀 2287·2019-08-23 14:46
閱讀 2265·2019-08-23 14:07
閱讀 1074·2019-08-23 14:03