1、Random類和Set集合來完成
Java實(shí)現(xiàn)生成n個(gè)不重復(fù)的隨機(jī)數(shù)可以使用Java中的Random類和Set集合來完成
具體代碼如下:
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class RandomNumberGenerator {
public static Set<Integer> generateRandomNumbers(int n, int max) {
if (n > max) {
throw new IllegalArgumentException("n must be less than or equal to max");
}
Set<Integer> set = new HashSet<>();
Random random = new Random();
while (set.size() < n) {
int num = random.nextInt(max) + 1;
set.add(num);
}
return set;
}
public static void main(String[] args) {
Set<Integer> set = generateRandomNumbers(5, 100);
System.out.println(set);
}
}
上述代碼中,使用了一個(gè)while循環(huán)來生成n個(gè)不重復(fù)的隨機(jī)數(shù)。在每次循環(huán)中,先生成一個(gè)范圍在1到max之間的隨機(jī)整數(shù),然后將其加入Set集合中,由于Set集合不允許元素重復(fù),所以會(huì)自動(dòng)去重,直到包含n個(gè)元素為止。最后返回生成的隨機(jī)數(shù)集合。
在main方法中,我們調(diào)用generateRandomNumbers方法來生成5個(gè)不重復(fù)的1到100之間的隨機(jī)數(shù),并使用System.out.println打印出來,輸出結(jié)果類似于[4, 27, 52, 76, 97]
2、使用數(shù)組來存儲(chǔ)生成的隨機(jī)數(shù)
每次生成隨機(jī)數(shù)之前判斷數(shù)組中是否已經(jīng)存在該數(shù),如果存在就繼續(xù)生成下一個(gè)隨機(jī)數(shù),直到生成了n個(gè)不重復(fù)的數(shù)為止
實(shí)現(xiàn)代碼如下:
import java.util.Arrays;
import java.util.Random;
public class RandomNumberGenerator {
public static int[] generateRandomNumbers(int n, int max) {
if (n > max) {
throw new IllegalArgumentException("n must be less than or equal to max");
}
int[] arr = new int[n];
Random random = new Random();
for (int i = 0; i < n; i++) {
int num;
do {
num = random.nextInt(max) + 1;
} while (contains(arr, num));
arr[i] = num;
}
return arr;
}
private static boolean contains(int[] arr, int num) {
for (int i : arr) {
if (i == num) {
return true;
}
}
return false;
}
public static void main(String[] args) {
int[] arr = generateRandomNumbers(5, 100);
System.out.println(Arrays.toString(arr));
}
}
上述代碼中,使用了一個(gè)for循環(huán)來生成n個(gè)不重復(fù)的隨機(jī)數(shù)。在每次循環(huán)中,先生成一個(gè)范圍在1到max之間的隨機(jī)整數(shù),然后調(diào)用contains方法來判斷該數(shù)是否已經(jīng)存在于數(shù)組中,如果不存在則加入數(shù)組。
在main方法中,我們調(diào)用generateRandomNumbers方法來生成5個(gè)不重復(fù)的1到100之間的隨機(jī)數(shù),并使用Arrays.toString打印出來,輸出結(jié)果類似于[4, 27, 52, 76, 97]。文章來源地址http://www.zghlxwxcb.cn/news/detail-607789.html
3、使用Fisher-Yates洗牌算法(也稱為Knuth洗牌算法)
除了使用Random類和Set集合或數(shù)組來生成n個(gè)不重復(fù)的隨機(jī)數(shù),還可以使用Fisher-Yates洗牌算法(也稱為Knuth洗牌算法)來實(shí)現(xiàn)。該算法的思路是:從原始數(shù)組中隨機(jī)選擇一個(gè)元素,將其與數(shù)組的第一個(gè)元素交換位置,然后從剩余的n-1個(gè)元素中隨機(jī)選擇一個(gè)元素,將其與數(shù)組的第二個(gè)元素交換位置,以此類推,直到遍歷完所有的n個(gè)元素為止。
具體實(shí)現(xiàn)代碼如下:
import java.util.Arrays;
import java.util.Random;
public class RandomNumberGenerator {
public static int[] generateRandomNumbers(int n, int max) {
if (n > max) {
throw new IllegalArgumentException("n must be less than or equal to max");
}
int[] arr = new int[max];
for (int i = 0; i < max; i++) {
arr[i] = i + 1;
}
Random random = new Random();
for (int i = max - 1; i >= max - n; i--) {
int index = random.nextInt(i + 1);
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
return Arrays.copyOfRange(arr, max - n, max);
}
public static void main(String[] args) {
int[] arr = generateRandomNumbers(5, 100);
System.out.println(Arrays.toString(arr));
}
}
上述代碼中,首先創(chuàng)建一個(gè)包含1到max的整數(shù)數(shù)組arr,然后使用Fisher-Yates洗牌算法來隨機(jī)打亂數(shù)組中的元素,最后返回?cái)?shù)組中的后n個(gè)元素。文章來源:http://www.zghlxwxcb.cn/news/detail-607789.html
在main方法中,我們調(diào)用generateRandomNumbers方法來生成5個(gè)不重復(fù)的1到100之間的隨機(jī)數(shù),并使用Arrays.toString打印出來,輸出結(jié)果類似于[4, 27, 52, 76, 97]。
到了這里,關(guān)于用Java生成N個(gè)不重復(fù)的隨機(jī)數(shù),3種實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!