在解決演算法問題中我們會經常遇到要求均等概率的問題, 以leetcode 470. 用 rand7() 實現 rand10() 為例。
已有方法 rand7 可生成 1 到 7 範圍內的均勻隨機整數,試寫乙個方法 rand10 生成 1 到 10 範圍內的均勻隨機整數。⚠️ 不討論最優解,只討論演算法思路 看到均等概率的問題, 我們最先要想到轉成2進製來處理,思路是讓均等概率轉換成均等概率出現0和1, 再由 0 和 1 ,增加位數來處理均等概率的其他數。 拆解下上面的題目 我們使用
rand7
轉成rand2
。讓rand2
的返回結果均等的出現 0 和 1, 我們可以用4位二進位制數來生成包含 0 ~ 15 的數。 捨棄 10~15,保留 0 到 9 ,結果加1 就是 1~ 10的隨機數。
第一步轉化二進位制函式
rand7()
的結果是均等概率 出現1,2,3,4,5,6
拆解下就是 均等概率出現1,2,3
和4,5,6
當出現1,2,3
的時候返回 0 ,當出現4,5,6
的時候返回 1
declare function rand7(): number
function rand2(): number
現在我們有了過渡函式rand2
, 那麼我們使用隨機生成4位二進位制數那麼我就會得到 乙個 均等生成 0 ~ 15 的函式
function rand15(): number
上面**略蠢,我們用移位的方法優化下, 左移操作符是二進位制進製的。
function rand15(): number
那麼最終的rand10()
函式, 我們只要捨棄掉 10~15 就可以了
function rand10(): number while ( num > 9)
return num + 1 // 別忘記 + 1
}
這道題解決完了, 再來一道題,思路也是用二進位制均等概率的
給乙個隨意函式f,以p概率返回 0 , 以 1-p 的概率返回1 這是你唯一可以使用的隨機機制,如何實現等概率返回 0 和 1思路還是用二進位制公升位的方式, 0 的概率是 p 1 的概率是 1- p
可以得出 00 的概率是 p*p , 11 的概率是 (1-p) * (1-p) 01 的概率是 p * (1-p) 10 的概率是 (1-p) * p 而這兩個是相等的(交換率)
那麼我們只要 保留 01 和 10 捨棄 00 和 11 就會獲得均等概率 p * (1-p)
10 和 01 這兩個數字不想等即可
declare function f(): 0 | 1
function round01 () : number while ( num == f())
return num
}
兩道小題都是用二進位制位來解決的演算法題。 解題思路也是兩個大致的方向,乙個是把高進製的數拆解成均等的二進位制均等概率,然後再組成目標數。另乙個是通過公升位來構造均等概率。 二進位制問題
題目 題解 純二進位制題目。因為所有的水都是由兩份相同的水合併而成的,因此每瓶水的體積一定是2 i,i in n 2 i i n 公升。最後保留k個瓶子,那麼最後總的公升數的二進位制表示中,1的個數一定 k。本題實質上是用不超過k個1和無數個0生成乙個最接近且大於n的二進位制數 方法一 includ...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
二進位制處理函式
unsigned const stat zero 0x0008 unsigned const stat one 0x0002 unsigned const stat two 0x0004 unsigned const stat three 0x0008 檢測位有1位是1就返回true templat...