JavaScript隨機數(shù)的組合問題案例分析
本文實例講述了JavaScript隨機數(shù)的組合問題。分享給大家供大家參考,具體如下:
隨機數(shù)的組合問題在面試時是經(jīng)??嫉?,比如之前我就被問到:“有一個可以生成1-5的隨機數(shù)函數(shù),怎樣把它擴大到1-7?”
在解決這個問題之前,先來看看另外一個比較簡單的問題:“有一個可以生成1-7的函數(shù),怎樣把它縮小到1-5?”下面是一個生成1-7函數(shù)random7:
function random7() { return Math.floor(Math.random() * 7 + 1); }
如何把它轉(zhuǎn)成生成1-5的函數(shù)呢?這很簡單:在一個循環(huán)里面調(diào)用random7,直到它的值小于等于5就結(jié)束循環(huán)并返回該隨機數(shù)即可,如下:
function random5() { var r = random7(); while(r > 5) { r = random7(); } return r; }
上面的思路就是:如果生成的隨機數(shù)大于5,就繼續(xù)調(diào)用random7,直到它小于等于5為止。好吧,回歸正題,再來看一下1-5如何轉(zhuǎn)成1-7吧。下面是一個隨機生成1-5的函數(shù):
function random5() { return Math.floor(Math.random() * 5 + 1); }
我們現(xiàn)在的目的是要把它擴大到1-7。有一種很自然的想法可能就是:一個random5()產(chǎn)生的隨機數(shù)范圍是1-5,那么兩個random5()相加的范圍就是2-10了,再減去1就是1-9了,所以,可以按照上面的思路,在random7里來個循環(huán),如果小于等于7就結(jié)束循環(huán)并且返回。如下:
function random7() { var r = random5() + random5() - 1; while(r > 7) { r = random5() + random5() - 1; } return r; }
這樣確實可以把1-5的范圍擴大到1-7,但是問題來了:所謂隨機函數(shù),產(chǎn)生的每個值的概率是相等的,但是上面的方法產(chǎn)生的值概率相等嗎?我們可以使用概率論的組合知識算岀來:生成1有一種組合,就是random5() + random5() - 1;中的兩個random5()均是1,生成2有兩種組合,第一個random5()是1第二個是2,或者相反。顯然,它們的概率是不等的。所以這種方法是不行的。
為了實現(xiàn)生成的每個值的概率是相等的,就是使得每個值的組合數(shù)相等。一種可行的方法是使得每個值的組合只有一種,如下:
function random7() { var r = (random5() - 1) * 5 + random5(); while(r > 7) { r = (random5() - 1) * 5 + random5(); } return r; }
為什么這樣就會使得各個值的概率相等呢?首先來看一下(random5() - 1) * 5,容易算岀這個表達式生成的可選值是0,5,10,15,20,用它去跟random5()相加,因為random5()的可選值是1,?。玻?,4,5,所以兩者相加之后就會得到1-25之間的隨機數(shù),而且產(chǎn)生的每個值的組合均只有一種,所以它們的概率也是相等的。
也許有人會問,(random5() - 1) * 5,這里為什么是乘以5而不是其他呢?這是因為乘以5之后和random5()相加,得到的數(shù)是連續(xù)的并且是等概率的。
上面討論的都是特殊情形1-5和1-7之間的轉(zhuǎn)換,對于其他的一般情形,大家可以自己試試哈。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript數(shù)學(xué)運算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
- JS生成隨機數(shù)的多種方法匯總(不同范圍、類型的隨機數(shù))
- JavaScript中隨機數(shù)方法?Math.random()
- Javascript實現(xiàn)仿QQ隨機數(shù)驗證
- Js生成隨機數(shù)/隨機字符串的方法小結(jié)【5種方法】
- js實現(xiàn)隨機數(shù)小游戲
- js控制隨機數(shù)生成概率代碼實例
- JavaScript生成指定范圍隨機數(shù)和隨機序列的方法
- javaScript產(chǎn)生隨機數(shù)的用法小結(jié)
- JS隨機數(shù)產(chǎn)生代碼分享
- JavaScript中獲取隨機數(shù)的幾種方法小結(jié)
相關(guān)文章
javascript實現(xiàn)根據(jù)函數(shù)名稱字符串動態(tài)執(zhí)行函數(shù)的方法示例
這篇文章主要介紹了javascript實現(xiàn)根據(jù)函數(shù)名稱字符串動態(tài)執(zhí)行函數(shù)的方法,結(jié)合實例形式分析了JS函數(shù)名的判斷及函數(shù)動態(tài)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2016-12-12JavaScript實現(xiàn)字符串轉(zhuǎn)數(shù)組的6種方法總結(jié)
數(shù)組是?JavaScript?中最強大的數(shù)據(jù)結(jié)構(gòu),我們常常通過將字符串轉(zhuǎn)換為數(shù)組來解決許多算法。本文為大家總結(jié)了6個JS字符串轉(zhuǎn)數(shù)組的方法,希望對你有所幫助2022-09-09