Я не могу получить случайное число из 4 цифр в JAVA - PullRequest
0 голосов
/ 07 октября 2019

Я действительно новичок в Java. Мне нужно создать метод, который создает случайное число из 4 цифр, например 0050, 0100, 9999. Таким образом, каждая цифра этого числа имеет предел от 0 до 9!

Вот что я нашел:

package randomNumber;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class RandomNumber {

    public static Set<Integer> getRandom(Set<Integer> setInt){

        setInt = new HashSet<Integer>();
        for (int i = 0; i < 4; i++){
            Random random = new Random();
            i = random.nextInt(10);     
            setInt.add(i);          
        };

        return setInt;
    }




    public static void main(String[] args) {
        System.out.println(getRandom(null));

    }

}

Так что я не совсем понял, почему в основном мне пришлось установить переменную в методе getRandom на «ноль». System.out.println (getRandom ());не сработало. Я был бы признателен, если бы кто-нибудь смог мне это объяснить

В любом случае, я был счастлив, что у меня не было сообщений об ошибках, пока я не запускаю код несколько раз. У меня есть либо 1-значное число, либо 2-значное число, а иногда и 3-значное число, но кажется, что у меня никогда не может быть 4-значного числа, тогда как в цикле for я указал, что я <4. Я не могу сохранить результаты до 4цифры. Почему? </p>

Я потерян! Если кто-нибудь может мне помочь, я был бы благодарен. Мне также интересно, если я использую правильный метод, так как мне нужно четырехзначное число, и я использовал хэш-набор, который в идеале дает мне таблицу из 4 элементов. Есть ли другой способ, чем хэш-сет?

Спасибо, ребята!

Ответы [ 5 ]

1 голос
/ 07 октября 2019

Set не имеет порядка и не содержит дубликатов - как в математике. Random - это то, что вы создаете один раз в программе, определенно не в середине цикла.

Если вам нужно случайное число от 0 до 9999, просто сгенерируйте случайное число. Затем вы можете добавить пропущенные нули при печати или преобразовании в строку:

private static Random rnd=new Random();
public static int getRandom(){
  return rnd.nextInt(10000);
}
public static void main(String args[]){
  int r=getRandom();
  System.out.println("As number: "+r);
  System.out.printf("As 4-digit code, just printing: %04d\n",r);
  String s=String.format("%04d",r);
  System.out.println("As 4-digit code, in separate string: "+s);
}

Тест: https://ideone.com/6Rmc8j (хотя Ideone кэшировал 4-значное число, невезение).

0 голосов
/ 07 октября 2019

Не следует указывать Set в качестве аргумента для getRandom.
Создать набор в методе getRandom и вернуть его.

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class RandomNumber {

    public static Set<Integer> getRandom(){

        HashSet<Integer> setInt = new HashSet<>();
        Random random = new Random();
        for (int i = 0; i < 4; i++){
            int n = random.nextInt(10);
            setInt.add(n);
        }
        return setInt;
    }

    public static void main(String[] args) {
        System.out.println(getRandom());
    }
}
0 голосов
/ 07 октября 2019

Мне нужно создать метод, который создает случайное число из 4 цифр, например 0050, 0100, 9999

Итак, ни одно из этих значений невозможно, так как использование Set предотвращаетповторяющиеся номера с момента добавления. И шансы, что вы получите 4 уникальные цифры из 10, довольно малы

, не очень понимая, почему в основном мне пришлось установить переменную в методе getRandom в значение "null". System.out.println (getRandom ());не сработало

У вас есть параметр для метода, но вы сразу же перезаписали его. Если вам нужен второй способ работы, удалите параметр метода

Есть ли другой способ, кроме хэш-набора?

Было ли какое-то требование использовать его? Если нет, то List и его подклассы будут лучшим вариантом

0 голосов
/ 07 октября 2019

Сначала ваши вопросы.

Аргумент getRandom(Set<Integer> setInt) не используется. Вы все равно создаете новый набор внутри функции. Вот почему прохождение null все еще работает. Так что с таким же успехом измените его на:

public static Set<Integer> getRandom(){

    Set<Integer> setInt = new HashSet<>();

Ваш цикл просто говорит, что вы хотите сделать цикл 4 раза. Если это произойдет, чтобы сгенерировать тот же номер, набор пропустит дубликат, так что вы можете получить меньше.

Что вам действительно нужно, так это список там, чтобы дубликаты не удалялись.

public static List<Integer> getRandom(){

  List<Integer> list = new ArrayList<>(4);

Кроме того, вы должны поставить Random снаружи. Если вы создаете новый каждый раз внутри цикла, он потеряет свою псевдослучайную последовательность.

Наконец, есть лучший способ, если вы решите использовать Java 8.

Random random = new Random();

return Stream.generate(() -> random.nextInt(10))
             .limit(4)
             .collect(Collectors.toList());
0 голосов
/ 07 октября 2019

Здесь есть что распаковать, но на конкретный вопрос:

Вы получаете разные результаты, потому что Set, по своей конструкции, принимает уникальные значения. Иногда вы получаете такое же целое число от Random, поэтому оно не добавляется в набор, потому что оно уже там.

Вам нужен ArrayList или что-то подобное.

...