摘要:使用來生成隨機(jī)數(shù)在日常操作中是普遍并且是簡(jiǎn)單的。如下上述代碼的作用是生成的隨機(jī)數(shù)。但是,如果把隨機(jī)數(shù)改成隨機(jī)整數(shù)。
使用 Math.random 來生成隨機(jī)數(shù)在日常操作中是普遍并且是簡(jiǎn)單的。如下:
let rnd = Math.random() * 10;
上述代碼的作用是生成 0~10 的隨機(jī)數(shù)。
那么,這些隨機(jī)數(shù)是出現(xiàn)的概率是均衡的嗎?
筆者沒辦法直接回答這個(gè)問題。因?yàn)樯傻碾S機(jī)數(shù)個(gè)數(shù)理論上是一個(gè)無窮大的數(shù)集,不過,可以按數(shù)值大小范圍來估算數(shù)值的分布是否平均:
let bucket = new Array(10).fill(0); let res = new Array(500000); // 做50萬次隨機(jī)數(shù) for(let i = 0; i < 500000; ++i) { res[i] = Math.random() * 10; // 數(shù)值大小規(guī)類 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) } )
以下是一次輸出結(jié)果:
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
結(jié)果顯示 Math.random() * 10 生成的數(shù)值分布是比較均衡的。
但是,如果把「隨機(jī)數(shù)」改成「隨機(jī)整數(shù)」。代碼改成:
let rnd = Math.round(Math.random() * 10);
上面代碼是生成 0~10 的隨機(jī)整數(shù)。
那么,這些隨機(jī)整數(shù)是出現(xiàn)的概率是均衡的嗎?
筆者直觀上覺得是隨機(jī)的,但是實(shí)際情況并不是!測(cè)試代碼如下:
let res = new Array(11).fill(0); // 做一萬次隨機(jī)數(shù) for(let i = 0; i < 500000; ++i) { ++res[Math.round(Math.random() * 10)]; } res.forEach((count, index) => console.log(index + "的概率:" + count / 500000))
以下是一次結(jié)果:
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
不難發(fā)現(xiàn),0 和 10 的概率是其它數(shù)值的一半左右,而其它數(shù)值的概率相差無幾。
Math.round 方法是造成「隨機(jī)整數(shù)」不均衡的原因
Math.round/Math.ceil/Math.floor 這三個(gè)函數(shù)作用是使一定范圍內(nèi)的實(shí)數(shù)轉(zhuǎn)換成同一個(gè)整數(shù)。以 Math.round 為例如下:
從上圖可以直觀地看到,頭尾兩數(shù)(0&10)的取值范圍是其它整數(shù)的一半!
生成隨機(jī)均衡整數(shù)的一種方案
其實(shí),只需要保證取值范圍的長度一致即可以實(shí)現(xiàn)隨機(jī)均衡整數(shù)。以下是筆者實(shí)現(xiàn)的一種方案:
let res = new Array(11).fill(0); // 做一萬次隨機(jī)數(shù) for(let i = 0; i < 500000; ++i) { ++res[Math.floor(Math.random() * 11)]; } res.forEach((count, index) => console.log(index + "的概率:" + count / 500000))
以下是一次輸出結(jié)果:
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
從結(jié)果上看分布是均衡的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90781.html
摘要:即服務(wù)提供者目前正在處理的請(qǐng)求數(shù)一個(gè)請(qǐng)求對(duì)應(yīng)一條連接最少,表明該服務(wù)提供者效率高,單位時(shí)間內(nèi)可處理更多的請(qǐng)求。此時(shí)應(yīng)優(yōu)先將請(qǐng)求分配給該服務(wù)提供者。初始情況下,所有服務(wù)提供者活躍數(shù)均為。 1.簡(jiǎn)介 LoadBalance 中文意思為負(fù)載均衡,它的職責(zé)是將網(wǎng)絡(luò)請(qǐng)求,或者其他形式的負(fù)載均攤到不同的機(jī)器上。避免集群中部分服務(wù)器壓力過大,而另一些服務(wù)器比較空閑的情況。通過負(fù)載均衡,可以讓每臺(tái)服務(wù)...
摘要:生成隨機(jī)數(shù)的方案網(wǎng)上有很多,但是在驗(yàn)證概率的時(shí)候卻發(fā)現(xiàn)不相同先把這種類型的隨機(jī)正整數(shù)生成方式貼出來。 生成隨機(jī)數(shù)的方案網(wǎng)上有很多,但是在驗(yàn)證概率的時(shí)候卻發(fā)現(xiàn)不相同先把這4種類型的隨機(jī)正整數(shù)生成方式貼出來。 ①、// 生成 [n,m),包含n但不包含m的正整數(shù): --?? parseInt(Math.random()*(m-n)+n) ②、// 生成(n,m],不包含n但包含m的正整數(shù):...
摘要:庫就可以方便地生成指定范圍的隨機(jī)數(shù)字,并且支持指定生成整數(shù)或是小數(shù)。 NPM酷庫,每天兩分鐘,了解一個(gè)流行NPM庫。 昨天,我們了解到 string-random 庫可以用來快速生成指定格式的隨機(jī)字符串,今天我們繼續(xù)學(xué)習(xí)如何生成隨機(jī)的數(shù)字。 其實(shí)只需要 Math.random()就可以生成一個(gè)隨機(jī)數(shù)字,但是這個(gè)數(shù)字大小是0~1,如果我們需要生成一個(gè)指定范圍的隨機(jī)數(shù)字,那么就需要進(jìn)一步的...
閱讀 3032·2021-11-24 10:32
閱讀 689·2021-11-24 10:19
閱讀 5172·2021-08-11 11:17
閱讀 1471·2019-08-26 13:31
閱讀 1270·2019-08-23 15:15
閱讀 2294·2019-08-23 14:46
閱讀 2281·2019-08-23 14:07
閱讀 1111·2019-08-23 14:03