• Java获取特定区间随机数及产生不重复随机数


    问题

    有这样一种需求,在这样一个数组中String[] arr = new String[]{"电商", "互联网", "小程序", "网络推广", "文化", "教育", "造型设计", "服装设计"};,随机取n个选项且不重复,n随机且在1-m这个范围之内,其中m是个确定的数且m<=数组长度。

    思路

    取特定区间的一个随机数

    // 从区间[1,4]随机取一个数
    Random random = new Random();
    int num = random.nextInt(4) + 1;
    
    // 从区间[MIN,MAX]随机取一个数(MAX>MIN,MIN>=0)
    Random random = new Random();
    int num = random.nextInt(MAX - MIN + 1) + MIN;
    
    // random.nextInt(num)取值范围是 [0,num)
    

    想要从一个长度为M的数组中随机的取其中的N个元素,有两种思路

    1. 产生N个不重复的随机数[0,M-1],根据下标从数组中取值
    2. 将数组内元素顺序打乱,取前N个数,即对前N个数,每个都和元素进行交换,随机么?

    思路1

    int startArray[] = {0,1,2,3,4,5,6,7,8,9};//seed array    
    int N = 10;//随机数个数    
    int resultArray[] = new int [10];//结果存放在里面    
    for(int i = 0; i < N; i++)    
    {    
        int seed = random(0, startArray.length - i);//从剩下的随机数里生成    
        resultArray[i] = startArray[seed];//赋值给结果数组    
        startArray[seed] = startArray[startArray.length - i - 1];//把随机数产生过的位置替换为未被选中的值。    
    } 
    

    思路2

    // 
    

    解决

    Random random = new Random();
    int num = random.nextInt(4) + 1;
    System.out.println("num:" + num);
    String[] arr = new String[]{"电商", "互联网", "小程序", "网络推广", "文化", "教育", "造型设计", "服装设计"};
    int len = arr.length;
    for (int i = 0; i < num; ++i) {
        int idx = random.nextInt(len - i);
        System.out.println(arr[idx]);
        String tmp = arr[idx];
        arr[idx] = arr[len - i - 1];
        arr[len - i - 1] = tmp;
    }
    

    参考

    产生N个不重复的随机数的快速算法

  • 相关阅读:
    谷歌地图嵌入配置及代码生成器
    Easyui几种布局方式的使用
    9款超酷的jQuery/CSS3插件
    8款功能强大的最新HTML5特效实例
    《大话操作系统——做坚实的project实践派》(2)
    1、libgdx简单介绍
    自己定义Android Dialog
    纪念2014 TI DSP大奖赛
    LeetCode 96:Unique Binary Search Trees
    Chromium网页输入事件捕捉和手势检測过程分析
  • 原文地址:https://www.cnblogs.com/okokabcd/p/9056017.html
Copyright © 2020-2023  润新知