【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
2017-09-28 18:42
337 查看
来源:http://www.cnblogs.com/haolujun/archive/2012/11/11/2765102.html
假如现在让你随机生成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]。
当然我们并不仅仅止于此,我们继续研究这个递推关系式,求出一个通项公式来。
现在设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,与我们的直觉是相符的。
现在,如果想得到n个不同的数,那么k应该大概是多少呢?
我们假设一系列的试验,C1,C2,C3,......,Ck中,Ci代表第i次试验随机生成的数字。
那么我们可以对试验进行阶段划分,阶段i为:第i次试验成功后的试验开始,第i+1次试验成功结束。阶段i的试验次数为X[i].
那么总的试验次数X=X[0] + X[1] + .... + X[n-1]。
第i个阶段的每次试验成功的概率为p=(n-i)/n,这是一个几何分布,也就是说第i个阶段的试验次数的期望为1/p= n/(n-i)。
那么总的试验次数期望为:X= n/(n-0) + n/(n-1) + n/(n-2) + ...... + n/1 = n*(1 + 1/2 + 1/3 + ...... + 1/n) = n * Hn
其中Hn=(1 + 1/2 + 1/3 + ...... + 1/n) ~ log(n)。所以,可以如果要生成n个不同的数,那么大概需要的试验次数是nlogn级别的。
假如现在让你随机生成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]=1 E[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,与我们的直觉是相符的。
现在,如果想得到n个不同的数,那么k应该大概是多少呢?
我们假设一系列的试验,C1,C2,C3,......,Ck中,Ci代表第i次试验随机生成的数字。
那么我们可以对试验进行阶段划分,阶段i为:第i次试验成功后的试验开始,第i+1次试验成功结束。阶段i的试验次数为X[i].
那么总的试验次数X=X[0] + X[1] + .... + X[n-1]。
第i个阶段的每次试验成功的概率为p=(n-i)/n,这是一个几何分布,也就是说第i个阶段的试验次数的期望为1/p= n/(n-i)。
那么总的试验次数期望为:X= n/(n-0) + n/(n-1) + n/(n-2) + ...... + n/1 = n*(1 + 1/2 + 1/3 + ...... + 1/n) = n * Hn
其中Hn=(1 + 1/2 + 1/3 + ...... + 1/n) ~ log(n)。所以,可以如果要生成n个不同的数,那么大概需要的试验次数是nlogn级别的。
相关文章推荐
- 随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
- shell 生成指定范围随机数与随机字符串
- shell 生成指定范围随机数与随机字符串
- JAVA中如何随机生成确定范围中的随机数
- Java编程实现从给定范围内随机N个不重复数生成随机数的方法小结
- 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从
- 随机生成一个对称矩阵,并输出。(究极版本,可以每一次都改变矩阵的随机数且不同,采用do while退出条件循环)
- JAVA中如何随机生成确定范围中的随机数
- 动态生成数组,随机生成一定范围的随机数,三种常用排序算法
- shell 生成指定范围随机数与随机字符串 .
- 生成N个不同的随机数(C++,范围0~N-1)
- 随机生成某个范围内的随机数(包含边界数)
- 在某个范围内随机生成N个不重复的随机数
- mysql获取某个范围内的随机数,写了个存储过程自动生成随机6为密码
- shell 生成指定范围随机数与随机字符串
- shell 生成指定范围随机数与随机字符串
- [功能帮助类] C# BaseRandom随机数,随机字符,可限制范围-帮助类 (转载)
- 转载:JAVA生成给定范围内的不重复的随机数的几种方法
- 随机生成不同的随机数
- [功能帮助类] C#RandomHelper随机数,随机字符,可限制范围-帮助类 (转载)