溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么解決均等概率問題

發(fā)布時(shí)間:2021-10-15 14:24:26 來源:億速云 閱讀:181 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“怎么解決均等概率問題”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在解決算法問題中我們會(huì)經(jīng)常遇到要求均等概率的問題, 以leetcode 470. 用 Rand7() 實(shí)現(xiàn) Rand10() 為例。

  • 已有方法 rand7 可生成 1 到 7 范圍內(nèi)的均勻隨機(jī)整數(shù),試寫一個(gè)方法 rand10 生成 1 到 10 范圍內(nèi)的均勻隨機(jī)整數(shù)。

  • ?? 不討論最優(yōu)解,只討論算法思路 看到均等概率的問題, 我們最先要想到轉(zhuǎn)成2進(jìn)制來處理,思路是讓均等概率轉(zhuǎn)換成均等概率出現(xiàn)0和1, 再由 0 和 1  ,增加位數(shù)來處理均等概率的其他數(shù)。拆解下上面的題目 我們使用 Rand7 轉(zhuǎn)成 Rand2 。讓 Rand2 的返回結(jié)果均等的出現(xiàn) 0 和 1,  我們可以用4位二進(jìn)制數(shù)來生成包含 0 ~ 15 的數(shù)。舍棄 10~15,保留 0 到 9 ,結(jié)果加1 就是 1~ 10的隨機(jī)數(shù)。

第一步轉(zhuǎn)化二進(jìn)制函數(shù)

Rand7() 的結(jié)果是均等概率 出現(xiàn) 1,2,3,4,5,6 拆解下就是 均等概率出現(xiàn) 1,2,3 和 4,5,6 當(dāng)出現(xiàn) 1,2,3 的時(shí)候返回 0  ,當(dāng)出現(xiàn) 4,5,6 的時(shí)候返回 1

declare function rand7(): number function Rand2(): number {  return Rand7() > 3 ? 1 : 0 }

現(xiàn)在我們有了過渡函數(shù) Rand2 , 那么我們使用隨機(jī)生成4位二進(jìn)制數(shù)那么我就會(huì)得到 一個(gè) 均等生成 0 ~ 15 的函數(shù)

function Rand15(): number {  return Rand2() * 2 * 2 * 2 + Rand2() * 2 * 2  + Rand2() * 2  + Rand2() }

上面代碼略蠢,我們用移位的方法優(yōu)化下, 左移操作符是二進(jìn)制進(jìn)位的。

function Rand15(): number {  return (rand2() << 3) + (rand2() << 2)  + (rand2() << 1)  +  (rand2() << 0) }

那么最終的 Rand10() 函數(shù), 我們只要舍棄掉 10~15 就可以了

function Rand10(): number {  let num: number  // 使用do while 循環(huán) 遇到小于10 的結(jié)束循環(huán)返回結(jié)果,遇到大的繼續(xù) roll   do {    num = Rand15()  } while ( num > 9)   return num + 1 // 別忘記 + 1  }

這道題解決完了, 再來一道題,思路也是用二進(jìn)制均等概率的。

  • 給一個(gè)隨意函數(shù)f,以P概率返回 0 , 以 1-P 的概率返回1 這是你唯一可以使用的隨機(jī)機(jī)制,如何實(shí)現(xiàn)等概率返回 0 和 1

  • 思路還是用二進(jìn)制升位的方式, 0 的概率是 P 1 的概率是 1- P

可以得出 00 的概率是 P*P , 11 的概率是 (1-P) * (1-P) 01 的概率是 P * (1-P) 10 的概率是 (1-P) * P  而這兩個(gè)是相等的(交換率)

那么我們只要 保留 01 和 10 舍棄 00 和 11 就會(huì)獲得均等概率 P * (1-P)

10 和 01 這兩個(gè)數(shù)字不想等即可

declare function f(): 0 | 1 function round01 () : number {  let num : number  do {   num = f()   } while ( num == f())  return num }

“怎么解決均等概率問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI