如何使用随机数和某些条件制作数组?

问题描述 投票:0回答:4

我需要使用随机数制作一个数组(矩阵)但没有任何重复,也有一些条件。我有这个代码,它可以使随机数不重复,但我有一个名为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
java matrix random
4个回答
2
投票

您可以轻松地将代码扩展到以下内容:

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; 
    }
}

2
投票

一个相当简单的方法是创建一个Set并预先生成随机数,直到该集合包含您需要的数量。然后循环遍历矩阵和Set,为Set为矩阵中的每个位置指定一个数字。

Set中添加数字时,您可以简单地排除您关注的数量。


0
投票

如果数字保持不变,你可以将它们全部放在一个列表中(例如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();
  }
}

0
投票

要完成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);
© www.soinside.com 2019 - 2024. All rights reserved.