获取不重复的随机数(抽签原理)
2016-11-11 11:43
232 查看
声明:以下方法基于抽签原理,每次抽取得到的概率相同,即依赖于之前的结果,如有错误则如下不成立。
平时,我们获取不重复的随机数时,一般需要有个位图,或者集合记录,或者进行循环嵌套比较,保证没有重复的数字被选中出来,我今天使用抽样的时候也想了一下这个问题。做下记录,如下:
1、我们希望从1~100这100个数中,随机抽取10个不重复的数
2、这相当于找出一个由1和0表示的序列,序列长度为100,其中1的个数为10
3、这相当于一个装有100个球的袋子,其中白球90个,黑球10个
4、从袋子中依次取1个球,不放回,记录其颜色,而得到的序列
5、我们可以计算第N个球取黑色的概率,是1/10
6、不放回抽样的概率是等可能的,如第2个球取黑色的概率为(10/100)*(9/99)+(90/100)*(10/99) = 1/10
7、这样可以通过调整每次取随机数,比较当前的球的比例,确定此次取球的颜色
8、根据取黑球的位置,确定随机数的具体值
代码如下:
结果如下:
平时,我们获取不重复的随机数时,一般需要有个位图,或者集合记录,或者进行循环嵌套比较,保证没有重复的数字被选中出来,我今天使用抽样的时候也想了一下这个问题。做下记录,如下:
1、我们希望从1~100这100个数中,随机抽取10个不重复的数
2、这相当于找出一个由1和0表示的序列,序列长度为100,其中1的个数为10
3、这相当于一个装有100个球的袋子,其中白球90个,黑球10个
4、从袋子中依次取1个球,不放回,记录其颜色,而得到的序列
5、我们可以计算第N个球取黑色的概率,是1/10
6、不放回抽样的概率是等可能的,如第2个球取黑色的概率为(10/100)*(9/99)+(90/100)*(10/99) = 1/10
7、这样可以通过调整每次取随机数,比较当前的球的比例,确定此次取球的颜色
8、根据取黑球的位置,确定随机数的具体值
代码如下:
double white = 10.0; double black = 10.0; double rate = 0.0; Random random = new Random(System.currentTimeMillis()); double tmp = 0.0; int count = 0; while(true){ if(white <= 0.0 || black <= 0.0){ break; } rate = black / (black + white); tmp = random.nextDouble(); if(tmp <= rate){ black--; // System.out.print("1 "); System.out.print(count + " "); }else{ white--; // System.out.print("0 "); } count++; } while(white > 0.0){ --white; // System.out.print("0 "); count++; } while(black > 0.0){ --black; System.out.print(count + " "); // System.out.print("1 "); count++; }
结果如下:
4 5 8 9 11 12 16 17 18 19
相关文章推荐
- JavaScript获取不重复随机数
- python 获取一定范围内不重复的多个随机数列表
- C# 获取没有重复的随机数
- Unity3D -- 获取不重复的随机数
- 获取特定范围内的随机数且不重复
- javascript获取不重复的随机数的方法比较
- php获取一定范围内取N个不重复的随机数
- 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
- 利用servlet产生随机数,原理是获取Graphics对象进行绘图
- 如何获取不重复的随机数
- python 获取一定范围内不重复的多个随机数列表
- C# 获取随机数 或者随机数组 。net获取不重复的随机数或者随机数组
- 获取1--N的不重复随机数
- python 获取一定范围内不重复的多个随机数列表
- 用Random获取不重复的随机数
- C# 获取某一范围内的不重复随机数
- 用 java 语言获取 1--N 的不重复随机数
- cocos2d-x:获取不重复的随机数
- 获取随机数并解决重复问题
- php获取一定范围内取N个不重复的随机数