Fer*_*nez 30 java random duplicates
我想在Java中创建一组没有重复的随机数.
例如,我有一个数组来存储从0到9999的10,000个随机整数.
这是我到目前为止:
import java.util.Random;
public class Sort{
public static void main(String[] args){
int[] nums = new int[10000];
Random randomGenerator = new Random();
for (int i = 0; i < nums.length; ++i){
nums[i] = randomGenerator.nextInt(10000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但上面的代码会产生重复.如何确保随机数不重复?
Ach*_*Jha 42
Integer[] arr = {...};
Collections.shuffle(Arrays.asList(arr));
Run Code Online (Sandbox Code Playgroud)
例如:
public static void main(String[] args) {
Integer[] arr = new Integer[1000];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
System.out.println(Arrays.toString(arr));
}
Run Code Online (Sandbox Code Playgroud)
可以在Programming Pearls p.中找到一个简单的算法,它可以为您提供无重复的随机数.127.
注意:结果数组按顺序包含数字!如果你想以随机顺序使用它们,你必须使用Fisher-Yates shuffle或使用List和call 来对数组进行混洗Collections.shuffle().
此算法的好处是您不需要创建具有所有可能数字的数组,并且运行时复杂性仍然是线性的O(n).
public static int[] sampleRandomNumbersWithoutRepetition(int start, int end, int count) {
Random rng = new Random();
int[] result = new int[count];
int cur = 0;
int remaining = end - start;
for (int i = start; i < end && count > 0; i++) {
double probability = rng.nextDouble();
if (probability < ((double) count) / (double) remaining) {
count--;
result[cur++] = i;
}
remaining--;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
在 Java 8 中,如果你想在 中拥有一个list非重复的N随机整数range (a, b),其中b是独占的,你可以使用这样的东西:
Random random = new Random();
List<Integer> randomNumbers = random.ints(a, b).distinct().limit(N).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80624 次 |
| 最近记录: |