美文网首页
02. 彩票随机号码

02. 彩票随机号码

作者: yangsg | 来源:发表于2019-03-30 07:12 被阅读0次

在[1,m]个数字区间生成彩票的n个不同随机号码。
如果常规思考,生成数字存到数组中,再随机生成数字与数组中的比较。
如果随机生成的数字与数组中已生成的数字不相同就存入数组,否则就舍弃,重新随机生成。
理论上存在极低极低的概率脸很“黑”,一直随机出现过的数字,那么这个程序的运行时间存在着无穷大的情况。
如何在随机n次就可以得到n个不同数字,我思考的思路如下

  1. 将[1,m]依次存入长度是m的数组,其下标是[0,m-1]
  2. 随机第一个下标[0,m-1],假设为4,将下标4对应的数字与下标m-1的进行交换
  3. 随机第二个下标[0,m-2],假设还是4,将下标4对应的数字与下标m-2的进行交换
  4. 随机第三个下标[0,m-3],假设还是4,将下标4对应的数字与下标m-3的进行交换
    ...

n. 随机第n个下标,假设一直都是4,将下标4对应的数字与下标m-n的进行交换
这样,虽然一直随机的都是4,但下标4对应的内容每次都不同,所以n次随机可以得到n个不同数字。
代码:

public static int[] getRandomLottle(int m, int n) {
    int[] a = new int[m];
    int[] b = new int[n];
    //初始化数组a,范围[1,m]
    for(int i = 0; i < m; i++) {
        a[i] = i+1;
    }
    
    int temp;
    //开始随机n次
    for(int i = 0; i < n; i++) {
        Random r = new Random();
        //随机范围不断缩小
        int idx = r.nextInt(m-i);
        b[i] = a[idx];
        //交换
        temp = a[idx];
        a[idx] = a[m-1-i];
        a[m-1-i] = temp;
    }
    
    Arrays.sort(b);
    return b;
}

相关文章

网友评论

      本文标题:02. 彩票随机号码

      本文链接:https://www.haomeiwen.com/subject/llzqbqtx.html