【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
来源: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]。
当然我们并不仅仅止于此,我们继续研究这个递推关系式,求出一个通项公式来。
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的随机数,其中有多少个不同的随机数?的更多相关文章
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...
- 用php随机生成福彩双色球号码的2种方法
不瞒您说,俺也是个双色球爱好者,经常买,但迟迟没有中过一等奖,哈哈.这里为大家介绍用php随机生成福彩双色球号码的二种方法,供朋友们学习参考.新的一年,祝大家中大奖,发大财. 方法一 复制代码代码如下 ...
- c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;
网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...
- .Net (MVC) 随机生成验证码
以前一直对C#的GDI画图部分知识点不怎么用所以忘得差不多了,这两天正好公司要做一个博客系统,其中一个需求就是留言时为了防止恶意攻击必须填写验证码,正好借着这个机会复习了一下,以下是实现代码,写的比较 ...
- 随机生成MyEclipse注册码
package com.registercode; import java.io.BufferedReader;import java.io.IOException;import java.io.In ...
- php随机生成福彩双色球号码
发布:thebaby 来源:net [大 中 小] 不瞒您说,俺也是个双色球爱好者,经常买,但迟迟没有中过一等奖,哈哈.这里为大家介绍用php随机生成福彩双色球号码的二种方法,供朋友们学习 ...
- Java随机生成定长纯数字或数字字母混合数
(转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码
- Android锁定EditText内容和随机生成验证码
昨天写了个小Demo,实现了随机生成验证码,和锁定EditText两个小功能,先看一下效果图: 锁定EditText在我们不须要用户编辑EditText内容的时候能够用到,实现还是非常easy的,一行 ...
- js随机生成验证码及其颜色
今天迎来了2018年第一场雪,这个美好的日子,总的写点什么纪念一下,在这里写了一个在js中使用Math.random()函数,随机生成四位数的验证码及其验证码换颜色. js代码如下: var arra ...
随机推荐
- CRB and Candies(组合数学+求逆元+lcm)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5407 题目: Problem Description CRB has N different cand ...
- 【HNOI】 lct tree-dp
[题目描述]给定2-3颗树,每个边的边权为1,解决以下独立的问题. 现在通过连接若干遍使得图为连通图,并且Σdis(x,y)最大,x,y只算一次. 每个点为黑点或者白点,现在需要删除一些边,使得图中的 ...
- yocto 离线编译
使用yocto编译一个软件包时,一般会先在本地寻找下载好的源码包,如果不存在则根据配置从网络下载. 添加本地源码包 为了支持离线编译,添加一个包的配置文件后,需要在本地也准备好源码包. 可以先打开网络 ...
- python基础===抽象
懒惰即美德 斐波那契数列: >>> fibs = [0,1] >>> for i in range(8): fibs.append(fibs[-2]+fibs[-1 ...
- smb windows中使用的文件共享协议(主要用于与windows互通)
主要是samba服务. SMB协议又成为CIFS(Common Internet File System)协议 samba服务功能: 1文件共享 2打印共享 3加入windows2000/2003/2 ...
- <摘录>Fedora添加国内源和本地源
<摘录>Fedora添加国内源和本地源 http://www.cnblogs.com/hummersofdie/p/3915070.html fedora的软件源信息文件(*.repo)都 ...
- Educational Codeforces Round 26 F. Prefix Sums 二分,组合数
题目链接:http://codeforces.com/contest/837/problem/F 题意:如题QAQ 解法:参考题解博客:http://www.cnblogs.com/FxxL/p/72 ...
- 阿里云ECS的使用
一.阿里云ECS的使用 1.Linux CentOS Ubuntu Readhat 2.远程登录 xshell 远程登录 winScp 远程文件操作 3.Linux命令 cd 目录名 ls . ls ...
- 1.Python3标准库--前戏
Python有一个很大的优势便是在于其拥有丰富的第三方库,可以解决很多很多问题.其实Python的标准库也是非常丰富的,今后我将介绍一下Python的标准库. 这个教程使用的书籍就叫做<Pyth ...
- pom报错解决方法大全
1.Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom 解决方法: Windows: CMD --> c ...