获取不重复的随机数(抽签原理)

来源:互联网 发布:seo 外链 编辑:程序博客网 时间:2024/06/05 05:23

声明:以下方法基于抽签原理,每次抽取得到的概率相同,即依赖于之前的结果,如有错误则如下不成立。

平时,我们获取不重复的随机数时,一般需要有个位图,或者集合记录,或者进行循环嵌套比较,保证没有重复的数字被选中出来,我今天使用抽样的时候也想了一下这个问题。做下记录,如下:

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 


0 0