Генерировать любое случайное число любой длины в Java

Как сгенерировать любое случайное число любой длины в Java? Например, чтобы сгенерировать число шириной 3, оно должно быть от 100 до 999. Итак, как это кодировать?
На изображении ниже:
Генерировать любое случайное число любой длины в Java
Хочу решить вторую проблему. Вот что я написал для первой задачи:

public int getRandomNumberReturntypediff(int min,int max) {
    Random rand = new Random();

    int  n = rand.nextInt(1000) + 1;
    Integer.toString(n);

    System.out.println("get Random Number with return type STRING" + n);
    return n;
}

Допустим, я беру параметр length и возвращаю String. Как я могу это сделать?

Это математический вопрос?

shmosel 26.10.2018 07:10

десять в степени n-1 даст нижний предел, в степени n верхний (плюс / минус один) - например, Math.pow(10, n)

user85421 26.10.2018 07:12

Для действительно больших чисел, скажем, более 10 цифр, вы можете генерировать одну цифру за другой и объединять их. Не самый быстрый подход, но он сработает.

Henry 26.10.2018 07:13

Ваше изображение не синхронизируется с вопросом, который вы написали в своем сообщении. «Предположим, я беру параметр (длина int) и возвращаю String» Он просит принять входные данные как два целых числа и вернуть случайное число между min и max. Я опубликовал свой ответ в соответствии с вашим снимком экрана, так как это фактически заданный вам вопрос.

Pushpesh Kumar Rajwanshi 26.10.2018 07:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
4
4 545
7

Ответы 7

Я думаю, это должно сработать:

int n = min + (int) (Math.random() * (max - min + 1));

Это неверно. Если я передаю min как 1 и max как 10, тогда 10-1 + 1 = 10, что означает, что rand * 10 может вернуть 9, и вы добавляете min + 9 = 10 и 10 должны быть исключительными. Вы не должны добавлять +1 в (макс. - мин. + 1)

Pushpesh Kumar Rajwanshi 26.10.2018 07:34

@PushpeshKumarRajwanshi, где ты видел, что максимум будет 10? Просто используйте 9, и он отлично работает.

Henry 26.10.2018 07:44

@Henry: для min = 1 и max = 10 (int) (Math.random () * (max - min + 1)) = (int) (Math.random () * (10-1+ 1)) = ( int) (Math.random () * (10)), которое никогда не может быть 10, но может быть 9. И поскольку мы добавляем к нему min (min + (int) (Math.random () * (max - min + 1))) = 1 + 9 = 10 Что следует исключить. Почему я сказал, что нам не нужно добавлять 1 при максимальном - минимальном

Pushpesh Kumar Rajwanshi 26.10.2018 09:07

@PushpeshKumarRajwanshi Я полностью это понимаю. Дело в том, что вы делаете здесь предположение, о котором нигде не говорится. Если мы возьмем max как наивысшее значение, которое реально может быть достигнуто, все в порядке. Одним из примеров может быть диапазон, заданный OP min = 100, max = 999.

Henry 26.10.2018 09:11

@ Генри: Ну, это заявлено. Если вы видите снимок экрана в сообщении, он говорит: «Если мы передадим входные данные как 400 и 4000, этот метод должен вернуть любое число от 400 до 4000». Обратите внимание: любое число «между» и «между» означает исключение заданных минимальных и максимальных чисел. Ничего подобного серьезному. Это было всего лишь моим маленьким предложением, хотя концепция ответа верна.

Pushpesh Kumar Rajwanshi 26.10.2018 09:35

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

Вы можете вычислить минимальное и максимальное значения, используя степень 10:

  • Минимум = 10 ^ (длина - 1)
  • Максимум = (10 ^ длина) - 1

Так, например, для числа 3 это даст вам минимум 100 и максимум 999.

Вот полный пример:

import java.util.Random;

public class Randoms {
    public static void main(String args[]) {
        System.out.println(generateRandom(3));
    }

    private static String generateRandom(int length) {
        int min = (int) Math.pow(10, length - 1);
        int max = (int) Math.pow(10, length); // bound is exclusive

        Random random = new Random();

        return Integer.toString(random.nextInt(max - min) + min);
    }
}

Если предположим, что я ввожу 2, тогда я хочу от 10 до 99, или если я поставлю 4, то от 1000 до 9000. Тогда как я могу это сделать?

Nikhil Boriwale 26.10.2018 07:25

Для 4 вы наверняка хотите от 1000 до 9999 вместо 9000? Что вам не подходит? Просто введите любую длину, которую хотите, при условии, что результирующие числа находятся в целочисленном диапазоне.

Robby Cornelissen 26.10.2018 08:31

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

static List<Character> NUMBERS_WITHOUT_ZERO = List.of('1', '2', '3', '4', '5', '6', '7', '8', '9');
static List<Character> NUMBERS_WITH_ZERO = List.of('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
private static final SecureRandom random = new SecureRandom();

public static BigInteger randomNumber(int length) {
    StringBuilder res = new StringBuilder(length);
    res.append(NUMBERS_WITHOUT_ZERO.get(random.nextInt(NUMBERS_WITHOUT_ZERO.size())));
    for (int i = 2; i <= length; i++)
        res.append(NUMBERS_WITH_ZERO.get(random.nextInt(NUMBERS_WITH_ZERO.size())));
    return new BigInteger(res.toString());
}

Надеюсь, это то, что вам нужно.

Если вы читаете снимок экрана (который является реальной проблемой, которую необходимо решить, и я знаю, что OP процитировал ее по-другому, что неверно), он говорит, что метод будет принимать два целых числа в качестве входных данных, min и max, и метод должен возвращать случайное число. между ними. Поскольку число находится только между двумя целыми числами, оно останется в пределах целых чисел. Так что не думайте, что нам нужно решать проблему для бесконечно больших чисел. Хотя изначально я также сделал подобное решение, но не думаю, что это то, что действительно нужно OP, видя снимок экрана в сообщении.

Pushpesh Kumar Rajwanshi 26.10.2018 09:27

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

Amin 26.10.2018 12:10

В ЭТОЙ СТРОКЕ ПОКАЗАНА ЭТА ОШИБКА: = static List <Character> NUMBERS_WITHOUT_ZERO = List.of ('1', '2', '3', '4', '5', '6', '7', '8' , '9'); статический список <Character> NUMBERS_WITH_ZERO = List.of ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ); «Ссылки на статические методы интерфейса разрешены только на уровне источника 1.8 или» Я использую MAC OS

Nikhil Boriwale 26.10.2018 15:47

Спасибо, @Amin. Решение проблемы: я добавляю один код в pom.xml = <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target > </properties>

Nikhil Boriwale 26.10.2018 16:18

Добро пожаловать. вы можете использовать Arrays.asList вместо List.of, и тогда вам больше не понадобится java 1.8.

Amin 26.10.2018 17:01
public void generateRandomNumber(int length){
     int max= Math.pow(10,length)-1;
     int min=Math.pow(10,length-1);
     int range = max - min + 1;
     int randomNumber = (int) (Math.random() * range) + min;
}     

Math.random() возвращает значение от больше 0,0 до 1,0.

предыдущий ответ был опубликован до того, как вопрос был отредактирован. Теперь я отредактировал ответ по вопросу

Gautham M 26.10.2018 07:31

Вам нужен этот метод,

public static int getRandNum(int min, int max) {
    return (int)(Math.random()*(max-min)) + min;
}

Как вы просили в своем посте на изображении, этот метод возвращает случайное число от min (включительно) до max (исключая).

Мой вариант

 public class RandomGen {

    public int getRandom(int min, int max) {
    Random random = new Random();
    return random.nextInt((max - min) + 1) + min;
     }
   }

    public class App {
      public static void main(String[] args) {
      RandomGen value = new RandomGen();
      System.out.println(value.getRandom(300, 400));
     }
    }

Не уверен, что это все еще актуально, если я понял, решение выходит из коробки в java.

Random sr = new SecureRandom();
IntStream ints = sr.ints(3, 100, 999);
Iterator<Integer> it = ints.boxed().collect(Collectors.toSet()).iterator();

Итератор такой же, как и любой другой, поэтому вы можете играть с ним по своему желанию. Сообщите мне, если это не то, что вам нужно.

Другие вопросы по теме