其實演算法是一種積累,看多了形成一種習慣,問題來了也就有感覺了。
千萬不要以為不看書就能把演算法做出了才算聰明。
那叫白痴。
阿里的一道隨機數生成的題目,這裡進行一下解釋
給定了rand7,如何生成rand3?
乙個非常直觀的思路,就是不斷的呼叫rand7,直到它產生1-3之間的數,然後返回。**如下:(如果有同學說這裡沒有3,但是不代表我不能判斷和3的大小比較吧)
[cpp]view plain
copy
print?
#include
intrand_3()
} }
接下來,就是判斷rand_3是否能等概率的產生1,2,3.也就是我們需要計算產生1,2,3的概率是否都是1/3.
首先,rand_7可以等概率的產生1-7,我們以rand_3生成1為例,假設:
因此,rand_3生成1的概率是p(x=1)= 1/7 + (4/7) * 1/7 + (4/7)^2 * 1/7 + ... + (4/7)^n-1 * 1/7 //等比數列
= 1/7 * ((1 - (4/7)^n) / 1 - 4/7) = 1/7 * 7/3 = 1/3
同理,可驗證生成2,3的概率均為1/3
上述證明說明rand3可以等概率的產生1,2,3.從上面的分析,我們可以得出乙個更一般的結論:
如果a>b,我們一定可以用rand_a去實現rand_b.其中,rand_a是等可能的生成1-a,rand_b是等可能的生成1-b
現在給定兩個生成隨機數的函式rand_a和rand_b,rand_a和rand_b分別產生1-a和1-b的隨機數,a和b不相等,現在讓你用rand_a實現rand_b,方法如下:
如果a>b,則可以直接採用上述方法
如果a
阿里2023年筆試題目,是給定生成1-7的隨即函式rand_7,看是否能生成其它隨機數?
我們先看一下是否能等概率生成1-49,構造rand_49 = 7 * (rand_7 - 1) + rand_7
(ps:別問我7從**來的,rand_7既然能隨即生成1-7,我當然可以獲得到7了)
rand_7 - 1能等概率的生成0, 1, 2, 3, 4, 5, 6,每個數的生成概率都是1/7,所以*7之後,可以等概率的生成0,7,14,21,28,35,42,每個數的概率都是1/7
既然0,7,14,21,28,35,42每個數的概率都是1/7,當每個數都加上+rand_7之後,則1-49是等概率產生的,1/7 × 1/7 = 1/49,中間不會出現重複資料
所以,我們用rand_7產生了rand_49,有了rand_49,按照最初上面過濾的方法,我們當然可以獲得任何小於49的隨機函式
關於隨機數
昨天去網易筆試,最後一道題實在沒有時間寫了,大概題目這樣的 床前明月 疑是地 霜,舉頭望 月,低頭思故 a.光 上 明 鄉 b.上 明 鄉 光 c.鄉 上 明 光 d.光 鄉 上 明 請你編寫一函式,隨機扣掉每一句的乙個字,然後生成3個錯誤選項,乙個正確選項,選項的字必須是詩裡所缺的字。請寫出資料結...
關於隨機數
一般來說隨機數在系統中用於生成對稱金鑰,所以隨機數在安全中的地位至關重要,由於系統或者硬體的因素,生成真實的隨機數存在著效能上的問題,對於服務端來說,一次生成大量的真隨機數比較困難,實際應用中都是把真隨機數作為種子 隨機數生成演算法生成大量的隨機數,稱為偽隨機數。為了保證偽隨機數的安全性,防止被 對...
關於隨機數!
1 眾所周知,c語言的隨機函式 rand 每次執行的結果是一樣的。如下 那麼就需要設定隨機種子了,srand gettickcount 如下 2 從指定佇列取n個隨機數 借助stl的函式可以完成。templatevoid random shuffle randomaccessiterator fir...