這個問題很有意思, 首先說一下推導原理, 很簡單,高中學過的數學歸納法.
先從簡單的說起,如何等概率的從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,那麼就可以保證所有的數字等概率取到.
這個問題有一本數裏提到過,給大家推薦一下<<編程之法:面試和算法心得>>.裏面可能是翻譯的,看的有點迷,我這裏實際上是它的思路,但是我覺得我講的我自己能聽懂啊.哈哈哈,有問題歡迎留言交流.