在[1,m]个数字区间生成彩票的n个不同随机号码。
如果常规思考,生成数字存到数组中,再随机生成数字与数组中的比较。
如果随机生成的数字与数组中已生成的数字不相同就存入数组,否则就舍弃,重新随机生成。
理论上存在极低极低的概率脸很“黑”,一直随机出现过的数字,那么这个程序的运行时间存在着无穷大的情况。
如何在随机n次就可以得到n个不同数字,我思考的思路如下
- 将[1,m]依次存入长度是m的数组,其下标是[0,m-1]
- 随机第一个下标[0,m-1],假设为4,将下标4对应的数字与下标m-1的进行交换
- 随机第二个下标[0,m-2],假设还是4,将下标4对应的数字与下标m-2的进行交换
- 随机第三个下标[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;
}
网友评论