如何從n個數中等概率選取m個數

這個問題很有意思, 首先說一下推導原理, 很簡單,高中學過的數學歸納法.

先從簡單的說起,如何等概率的從n個數字中選取一個數.當然很多人說, java或者C++有簡單的接口調用,是的,但是要注意避免僞隨機,這個可以參考https://www.cnblogs.com/salan668/p/3652532.html. 有人說, 這種方法也沒法隨機, 如果我們認爲這點不成立的話,那任何語言也無法解決這個問題了.就假設成立就好.

我們得到了n個數字中隨機的一個數,下面開始推導:

假設我們從n中選取兩個數:

如果n = 2,那麼選取的概率是100%;

如果n = 3,  那麼我們保證選取到第三個數的概率是1/3, 比如用(rand()%3 ==0,這裏爲了表示方便,認爲rand()爲隨機);除了保證第三個數取到的概率是1/3,還要保證前面兩個數也是1/3, 所以前面兩個數選取到的概率是2/3,其中選取其中之一的概率就是2/3*(1/2) = 1/3

成立.

如果n = 4, 同上.

依次類推, 不管n等於多少,只要保證第n個數取到的概率是1/n,那麼就可以保證所有的數字等概率取到.

這個問題有一本數裏提到過,給大家推薦一下<<編程之法:面試和算法心得>>.裏面可能是翻譯的,看的有點迷,我這裏實際上是它的思路,但是我覺得我講的我自己能聽懂啊.哈哈哈,有問題歡迎留言交流.

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章