Как выбрать случайную строку только один раз без использования Arraylist - PullRequest
4 голосов
/ 16 июня 2020

есть ли способ выбрать случайную строку из массива и не выбирать строку снова. как только все строки выбраны только один раз, программа завершается.

вот моя текущая система, publi c stati c void main (String [] argv) {

    //String [] names = new String[5];
    String [] names = {"Snoopy", "Donald Duck", "Mickey Mouse", "Little Timmy", "Spiderman"};
    //put a list of names in an array
    //randomly pick a name out of the array
    //how to: randomly pick a number as the index
    //range: 0 to the number of names - 1


    int n = -1;
    int previous = n;
    int storing1 = -1;
    int storing2 = -1;
    int storing3 = -1;
    int storing4 = -1;

    System.out.println(previous);
    while (true) {

        System.out.println("Hit \"enter\" to spin");
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        //if (s.equalsIgnoreCase("s")) {

        storing4 = storing3;
        storing3 = storing2;
        storing2 = storing1;
        storing1 = previous;
        previous = n;
        n = (int) (Math.random() * names.length);

        if (n == previous || n == storing1 || n == storing2 || n == storing3 || n == storing4) {
            System.out.println("This person has already been picked");

            break;

        }

        System.out.print("n = " + n + " ");
        String picked = names[n];
        System.out.println("Congratulations, " + picked + " was picked!");

        }
        System.out.println(previous);
        System.out.println(storing1);
        System.out.println(storing2);
        System.out.println(storing3);
        System.out.println(storing4); //for my own use, to tell if the storing system works properly



        }

моя проблема в том, что консоль будет возвращать «этот человек уже выбран» и так далее. Нельзя сказать, что система завершения программы не работает, так как перерыв сработает преждевременно.

[1]: https://i.stack.imgur.com/54Eef.png [как вы можете видеть, программа завершается, даже если не все пять имен были выбраны, потому что раньше было выбрано одно и то же] [1] извините если это кажется простым, я только начал java несколько месяцев go. Я не думаю, что мне разрешено использовать ArrayList, и это единственное решение, которое я нашел до сих пор. спасибо.

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Если вы не можете использовать список с перемешиванием для хранения случайных имен, то, возможно, вы можете вместо этого использовать список индексов и перемешать его:

String [] names = {"Snoopy", "Donald Duck", "Mickey Mouse", "Little Timmy", "Spiderman"};
List<Integer> indices = IntStream.of(0,1,2,3,4).boxed().collect(Collectors.toList());
Collections.shuffle(indices);

// now iterate the indices and consume random names, one time only
for (int index : indices) {
    System.out.println("Random name: " + names[index]);
}
1 голос
/ 16 июня 2020

Этот вопрос можно решить с помощью Random.

Вы можете случайным образом перемешать этот массив {names}, а затем выбрать имена [index] (индекс начинается с 0, заканчивается на names.length - 1).

Как перемешать этот массив:

Random r = new Random();
for (int i = 0; i < names.length; i++){
    int nextSwapIndex = r.nextInt(names.length);
    String temp = names[nextSwapIndex];
    names[nextSwapIndex] = names[i];
    names[i] = temp;
}
0 голосов
/ 16 июня 2020

Просто измените порядок в списке случайным образом, а затем распечатайте строки одну за другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...