02. 彩票随机号码

在[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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容