亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決JavaScript隨機數的組合問題

發布時間:2020-07-27 10:02:37 來源:億速云 閱讀:167 作者:小豬 欄目:web開發

這篇文章主要講解了如何解決JavaScript隨機數的組合問題,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

隨機數的組合問題在面試時是經常考的,比如之前我就被問到:“有一個可以生成1-5的隨機數函數,怎樣把它擴大到1-7?”

在解決這個問題之前,先來看看另外一個比較簡單的問題:“有一個可以生成1-7的函數,怎樣把它縮小到1-5?”下面是一個生成1-7函數random7:

function random7() {
  return Math.floor(Math.random() * 7 + 1);
}

如何把它轉成生成1-5的函數呢?這很簡單:在一個循環里面調用random7,直到它的值小于等于5就結束循環并返回該隨機數即可,如下:

function random5() {
  var r = random7();
  while(r > 5) {
    r = random7();
  }
  return r;
}

上面的思路就是:如果生成的隨機數大于5,就繼續調用random7,直到它小于等于5為止。好吧,回歸正題,再來看一下1-5如何轉成1-7吧。下面是一個隨機生成1-5的函數:

function random5() {
  return Math.floor(Math.random() * 5 + 1);
}

我們現在的目的是要把它擴大到1-7。有一種很自然的想法可能就是:一個random5()產生的隨機數范圍是1-5,那么兩個random5()相加的范圍就是2-10了,再減去1就是1-9了,所以,可以按照上面的思路,在random7里來個循環,如果小于等于7就結束循環并且返回。如下:

function random7() {
  var r = random5() + random5() - 1;
  while(r > 7) {
    r = random5() + random5() - 1;
  }
  return r;
}

這樣確實可以把1-5的范圍擴大到1-7,但是問題來了:所謂隨機函數,產生的每個值的概率是相等的,但是上面的方法產生的值概率相等嗎?我們可以使用概率論的組合知識算岀來:生成1有一種組合,就是random5() + random5() - 1;中的兩個random5()均是1,生成2有兩種組合,第一個random5()是1第二個是2,或者相反。顯然,它們的概率是不等的。所以這種方法是不行的。

為了實現生成的每個值的概率是相等的,就是使得每個值的組合數相等。一種可行的方法是使得每個值的組合只有一種,如下:

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, 2,3,4,5,所以兩者相加之后就會得到1-25之間的隨機數,而且產生的每個值的組合均只有一種,所以它們的概率也是相等的。

也許有人會問,(random5() - 1) * 5,這里為什么是乘以5而不是其他呢?這是因為乘以5之后和random5()相加,得到的數是連續的并且是等概率的。

上面討論的都是特殊情形1-5和1-7之間的轉換,對于其他的一般情形,大家可以自己試試哈。

看完上述內容,是不是對如何解決JavaScript隨機數的組合問題有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南昌县| 天长市| 黄山市| 桑日县| 永清县| 伊宁市| 江达县| 霍山县| 芒康县| 宜章县| 东港市| 民勤县| 乐东| 锡林郭勒盟| 融水| 阳信县| 田阳县| 图木舒克市| 鲁山县| 都兰县| 东丽区| 大安市| 吴川市| 巴青县| 三亚市| 东兰县| 揭阳市| 武夷山市| 牡丹江市| 舟山市| 西乌| 丹巴县| 卢氏县| 敦化市| 杭锦后旗| 台南县| 建始县| 门头沟区| 麻江县| 武义县| 拉萨市|