Как сделать массив со случайными числами и некоторыми условиями? - PullRequest
0 голосов
/ 12 марта 2019

Мне нужно сделать массив (матрицу) со случайными числами, но без дубликатов и с некоторыми условиями.У меня есть этот код, он может делать случайные числа без повторения, но у меня есть переменная с именем 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

Ответы [ 4 ]

2 голосов
/ 12 марта 2019

Вы можете легко расширить свой код до следующего:

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

еще более приятное решение (так же, как Тревор предложил бы, чтобы мы основывались на множестве - я поместил это в функцию:

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 голосов
/ 12 марта 2019

Один достаточно простой подход - создать Set и предварительно сгенерировать в нем ваши случайные числа, пока набор не будет содержать столько чисел, сколько вам нужно.Затем прокрутите вашу матрицу и Set, присваивая число из Set для каждой позиции в матрице.

При добавлении числа к Set вы можете просто исключить свой номер проблемы.

0 голосов
/ 13 марта 2019

Для полного ответа Арно:

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);
0 голосов
/ 12 марта 2019

Если числа остаются низкими, вы можете поместить их все в список (кроме, например, 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();
  }
}
...