在[1,m]個數(shù)字區(qū)間生成彩票的n個不同隨機號碼。
如果常規(guī)思考,生成數(shù)字存到數(shù)組中,再隨機生成數(shù)字與數(shù)組中的比較。
如果隨機生成的數(shù)字與數(shù)組中已生成的數(shù)字不相同就存入數(shù)組,否則就舍棄,重新隨機生成。
理論上存在極低極低的概率臉很“黑”,一直隨機出現(xiàn)過的數(shù)字,那么這個程序的運行時間存在著無窮大的情況。
如何在隨機n次就可以得到n個不同數(shù)字,我思考的思路如下
- 將[1,m]依次存入長度是m的數(shù)組,其下標是[0,m-1]
- 隨機第一個下標[0,m-1],假設(shè)為4,將下標4對應(yīng)的數(shù)字與下標m-1的進行交換
- 隨機第二個下標[0,m-2],假設(shè)還是4,將下標4對應(yīng)的數(shù)字與下標m-2的進行交換
- 隨機第三個下標[0,m-3],假設(shè)還是4,將下標4對應(yīng)的數(shù)字與下標m-3的進行交換
...
n. 隨機第n個下標,假設(shè)一直都是4,將下標4對應(yīng)的數(shù)字與下標m-n的進行交換
這樣,雖然一直隨機的都是4,但下標4對應(yīng)的內(nèi)容每次都不同,所以n次隨機可以得到n個不同數(shù)字。
代碼:
public static int[] getRandomLottle(int m, int n) {
int[] a = new int[m];
int[] b = new int[n];
//初始化數(shù)組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;
}