从0到m-1这m个数中随机取出n个(n<=m) 要求每个数被取到的可能性相等。 
第一个方法是把这m个数丢到一个List里面 然后用nextInt(list.size())来产生随机数 然后把list里面对应的元素丢到另一个数组或者list里面 这个方法本来是不错的 但要注意的是 为了保证每个元素取到的概率相等 需要每取出一个元素 就把它从list里面删除 原因就不解释了 简单的概率问题。但众所周知的是 list的remove(int index)方法 效率并不高 尤其是当m和n很大的时候 每一次调用remove ArrayList都需要进行数组的copy 而LinkedList需要进行链表的遍历。 
所以再考虑这个问题,用数组来储存这m个数是很好的 而且其实我们并不需要知道到底哪些下标的元素被选中了 第一个方法的效率低下的原因在于 nextInt(int i)这个方法是从0 到i-1随机生成整数 这里要求0到i-1是连续的i个整数 而我们选取了一个数之后 为了满足连续整数的条件 就要把这个数删去 而频繁删除的效率是低下的 所以换一种思路 不采用删除 而采用交换

第二个方法 比如0-99这100个数字 从小到大放在一个数组里面 现在要选10个 我们只需要随机打乱这个数组 然后选取前10个元素就好 随机打乱的方法就是 从数组头元素开始 每次产生一个随机数n 然后交换这两个数 而且只需要交换十次就够了 因为我们并不取下标超过10后面的数字

import java.util.Random;  

public class Rand {  

    public static void randSelect(int[] nums, int n) {
Random rand = new Random();
for(int i = 0; i < n; i ++){
swap(nums , i, rand.nextInt(nums.length-i)+i);
}
} public static void swap(int[] nums, int m , int n){
int temp = nums[n];
nums[n] = nums[m];
nums[m] = temp;
} public static void main(String[] args) {
int[] nums = new int[100];
for(int i = 0;i < 100;i++){
nums[i]=i;
}
randSelect(nums,10);
for(int i = 0;i < 10; i ++){
System.out.println(nums[i]);
}
}
} /*output :&nbsp;
27
79
30
58
41
54
75
18
26
5
*/

最新文章

  1. Android开发之广播
  2. [No000017]单词拼写记不住?试试这俩方法-单词拼写,怎么记又快又好?
  3. Java获取新浪微博cookies
  4. quartz+spring 实现多任务动态定时器问题
  5. Codeforces Round #249 (Div. 2) B. Pasha Maximizes
  6. 【wikioi】1014 装箱问题
  7. 【转义字符】HTML 字符实体&amp;lt; &amp;gt: &amp;amp;等
  8. RHEL与Centos
  9. 【实战】静默安装-oracle 11.2.0.3 on centos 5.10
  10. SZU : A18 (Climb Well)
  11. ThreadLocal线程本地变量
  12. for语句,你真正搞懂了吗?
  13. cesium 显示北京时间
  14. BSGS与扩展BSGS
  15. 检查MySQL内存使用情况
  16. C# string.join
  17. 出现明明SQL语句没问题,但是却无法通过代码查询到结果的问题。
  18. 如何让classmethod只允许使用用类对象来调用
  19. 常见的NoSQL数据库
  20. Ubuntu16.04安装Elasticsearch

热门文章

  1. Linux networkmanager
  2. 当网卡收到一个包的目的地址是本主机其他接口的IP时.2
  3. BZOJ5300 [Cqoi2018]九连环 【dp + 高精】
  4. HDU 1087 最大上升子序列的和
  5. Windows 2008 R2无法打补丁
  6. MySQL5.7源码安装问题汇总
  7. linux下scp
  8. Uva 10158 War
  9. Java遍历list集合的4种方法
  10. 【linux高级程序设计】(第十四章)TCP高级应用 3