我需要使用随机数制作一个数组(矩阵)但没有任何重复,也有一些条件。我有这个代码,它可以使随机数不重复,但我有一个名为DifferentNumber的变量,随机数必须与该数字不同
Matriz2[0][i] = (int) (Math.random() * range);
for (i = 1; i < cantidad; i++) {
Matriz2[0][i] = (int) (Math.random() * range);
for (int j = 0; j < i; j++) {
if (Matriz2[0][i] == Matriz2[0][j]) {
i--;
}
}
}
例如,
DifferentNumber = 25
矩阵必须从0到45不重复,并且不同于25这样的东西:
Matrix [0][0] = 26
Matrix [0][1] = 1
Matrix [0][2] = 40
Matrix [0][3] = 39
您可以轻松地将代码扩展到以下内容:
Matriz2[0][i] = (int) (Math.random() * range);
for (i = 1; i < cantidad; i++) {
Matriz2[0][i] = (int) (Math.random() * range);
// add this if / else statement
if (Matriz2[0][i] == DifferentNumber) {
i--;
} else {
for (int j = 0; j < i; j++) {
if (Matriz2[0][i] == Matriz2[0][j]) {
i--;
}
}
}
}
一个更好的解决方案(很像Trevor建议我们基于set - 我把它放到一个函数中:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set<Integer> exclude = new HashSet<>();
exclude.add(4);
exclude.add(6);
exclude.add(7);
for (int[] arr : getRandomMatrix(10, 15, exclude)) {
for (int i : arr) {
System.out.println("rnd: " + i);
}
}
}
public static int[][] getRandomMatrix(int cantidad, int range, Set<Integer> excludeNumbers) {
int[][] Matriz2 = new int[1][cantidad];
Set<Integer> randomNumbers = new HashSet<>();
while (randomNumbers.size() < cantidad) {
int randomNumber = -1;
while(randomNumber == -1 || excludeNumbers.contains(randomNumber)) {
randomNumber = (int) (Math.random() * range);
}
randomNumbers.add(randomNumber);
}
List<Integer> list = new ArrayList<>(randomNumbers);
for (int i = 0; i < list.size(); i++) {
Matriz2[0][i] = list.get(i);
}
return Matriz2;
}
}
一个相当简单的方法是创建一个Set
并预先生成随机数,直到该集合包含您需要的数量。然后循环遍历矩阵和Set
,为Set
为矩阵中的每个位置指定一个数字。
在Set
中添加数字时,您可以简单地排除您关注的数量。
如果数字保持不变,你可以将它们全部放在一个列表中(例如25除外)然后将其洗牌:
List<Integer> randomNumbers = new ArrayList<>();
for (int i = 0; i < 100; i++) {
if (i != 25) {
randomNumbers.add(i);
}
}
Collections.shuffle(randomNumbers);
或者以Java 8方式:
List<Integer> randomNumbers = IntStream.rangeClosed(0, 100)
.filter(i -> i != 25) //or any condition you want
.boxed()
.collect(Collectors.toList());
Collections.shuffle(randomNumbers);
现在,你可以一个接一个地拿它们。在这里,迭代器更方便:
Iterator<Integer> iterator = randomNumbers.iterator();
for (row = 0; row < 10; row++) {
for (int col = 0; col < row; col++) {
matrix[row][col] = iterator.next();
}
}
要完成Arnaud的答案:
List<Integer> randomNumbers = new Random().ints(45,0, 45) //45 items in range 0-45
.distinct() //don't allow duplicate number
.filter(i -> i != 25) //or any condition you want
.boxed()
.collect(Collectors.toList());
Collections.shuffle(randomNumbers);