获取不重复的随机数(抽签原理)
来源:互联网 发布: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
- 获取不重复的随机数(抽签原理)
- 获取不重复随机数
- 获取不重复随机数
- 获取指定范围内的不重复随机数
- 用Random获取不重复的随机数
- Unity3D -- 获取不重复的随机数
- 如何获取不重复随机数的
- JavaScript获取不重复随机数
- 获取不重复随机数分享
- 获取范围不重复随机数
- 不重复的随机数
- 不重复的随机数
- C# 获取某一范围内的不重复随机数
- 获取特定范围内的随机数且不重复
- 在JavaScript中获取不重复的随机数
- 明明的随机数(不重复,排序)+随机数生成
- C# 获取随机数 或者随机数组 。net获取不重复的随机数或者随机数组
- 例子---随机数/不重复的随机数
- 【codevs 1007】级数求和
- 唯品会基于Kubernetes(k8s)网络方案演进
- 解决类似超卖问题,mysql加锁
- bzoj1637: [Usaco2007 Mar]Balanced Lineup ——by lethalboy
- javascript 关闭浏览器怎么清空所有的cookie
- 获取不重复的随机数(抽签原理)
- Spring Batch 之 Sample(Hello World)(三)
- Linux系统文件防篡改脚本第一版
- 使用WARN_ON来追溯函数的调用关系
- concurrent包与线程池
- 栅格数据说明
- Java虚拟机学习(6):对象访问
- easy ui datagrid 列数据格式换行
- C++模板类的虚函数成员