1. 程式人生 > >Java獲取特定區間隨機數及產生不重復隨機數

Java獲取特定區間隨機數及產生不重復隨機數

sys ring 不重復隨機數 ref csdn AS dom out 生成

問題

有這樣一種需求,在這樣一個數組中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個不重復的隨機數的快速算法

Java獲取特定區間隨機數及產生不重復隨機數