您的位置:首页 > 其它

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

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、根据取黑球的位置,确定随机数的具体值

代码如下:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: