个人随笔
目录
工具类:给定一个数值all,随机产生size个不大于all不重复的下标
2021-03-18 17:02:22

背景

我们经常会遇到这样子的逻辑,从一批数中随机抽取一部分数据来。比如有1000个单词,每次随机生产50个单词给用户,怎么做呢?

解决办法

这里基于的是Java语言来解决,假设有个单词列表List 数量1000个allWords,然后要随机抽取一批单词比如100个itemWords,效率低的想法就是用while循环随机产生一个小于1000的下标,然后从allWords获取,判断是否在itemWords,如果在就再随机取一个,直到itemWords等于100为止。可以想象效率有多底下,那么我们换一种思路,其实只需要随机产生0~999的100个不重复的下标即可,然后for循环这些下标去allWords取,这样子效率就高了。

随机产生size个不大于all且不重复的下标

  1. /**
  2. * 从all里面随机产生size个不重复的下标
  3. * @param size 需要产生的下标数
  4. * @param all 范围
  5. * @return
  6. */
  7. public static int[] getRandomNums(int size,int all) {
  8. if(size>all) {
  9. System.err.println("size大于all"+size+">"+all);
  10. return null;
  11. }
  12. SecureRandom random = new SecureRandom();
  13. //把all当成一个list
  14. List<Integer> list = new ArrayList<Integer>();
  15. for(int i=0;i<all;i++) {
  16. list.add(i);
  17. }
  18. int[] result = new int[size];
  19. for(int j=0;j<size;j++) {
  20. //随机生成一个下标
  21. int index = random.nextInt(list.size());
  22. //根据下标去取list中的值
  23. result[j]=list.get(index);
  24. //从list移除该值
  25. list.remove(index);
  26. }
  27. return result;
  28. }
 156

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2