隨機產生k個範圍為1-n的隨機數,其中有多少個不同的隨機數?

來源:互聯網
上載者:User

假如現在讓你隨機產生k個範圍在1-n內的隨機數,那麼你能得到多少個不同的隨機數呢?剛開始想得時候,我認為當k<=n時,可以得到k個不同的隨機數,但是顯然這個想法錯了。做了個實驗在1-1024內隨機產生500個數,其中只有394個不同的數,隨機產生1000個數,其中有639個不同的數。

接下來是很枯燥的數學推導,如果你只是想看看最後的公式,那麼就看倒數第二行。如果你想看看推導過程那麼就看下去。下面說的東西用到了機率和組合數學中的線性常係數非齊次遞推關係。

現在我們想求一下,隨機產生k個範圍在1-n內的隨機數,能得到多少個不同的隨機數。

設我們隨機k次得到的的k個數字為x1,x2,......xk。

設E[i]為隨機i次得到的不重複數字個數的期望。

設p[i]為第i次隨機得到的xi與x1,x2,......,x[i-1]其中一個重複的機率。

設q[i]為第i次隨機得到的xi與x1,x2,......,x[i-1]中任何一個都不重複的機率。

那麼顯然p[i]=E[i-1]/n ,qi=(n-E[i-1])/n。

設Yi為指標變數,Yi=1代表xi與x1,x2,......,x[i-1]中任何一個都不重複,Yi=0代表xi與x1,x2,......,x[i-1]其中一個重複。

那麼由E[i]的意義可得E[i]=sigma(1*q[j])+sigma(0*p[j])=sigma(1*q[j])=sigma((n-E[j])/n) {0<=j<=i-1}。

現在可以得到E[i]=i-(1/n)*sigma(E[j]) {0<=j<=i-1}。現在我們就得到了一個遞推關係式,並且我們知道E[0]=0,E[1]=1,我們可以用這個遞推關係式求E[i]。

當然我們並不僅僅止於此,我們繼續研究這個遞推關係式,求出一個通項公式來。

E[1]=1E[2]=2-1/n * E[1]E[3]=3-1/n * (E[1]+E[2])E[4]=4-1/n * (E[1]+E[2]+E[3])...E[k]=k-1/n * (E[1]+E[2]+E[3]+......+E[k-1])我們把用下面的式子減去上面的式子得到:E[2]-E[1]=1-1/n * E[1]E[3]-E[2]=1-1/n * E[2]E[4]-E[3]=1-1/n * E[3]...E[k]-E[k-1]=1-(1/n)*E[k-1]

現在設S[i]=E[1]+E[2]+......+E[i],我們得到如下遞推式:S[k]-S[1]-S[k-1]=k-1-(1/n)*S[k-1]。

由於S[1]=1,我們得到:S[k]-(n-1)/n * S[k-1]= k。這是一個線性常係數非齊次遞推關係,對於這種遞推關係求通項公式,組合數學上說的很詳細。

通過解這個遞推關係,我們求得通項公式為S[k]=(1-2*n+n*n)*((n-1)/n)^(k-1)+(1-n)*n+n*k。

把S[k-1]帶入E[k]中得:  E[k]=k-(1/n)*((1-2*n+n*n)*((n-1)/n)^(k-2)+(1-n)*n+n*(k-1))

當k趨向正無窮時,E[k]=k-(1/n)*(0+(1-n)*n+n*(k-1))=n,與我們的直覺是相符的。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.