Как сгенерировать любое случайное число любой длины в Java? Например, чтобы сгенерировать число шириной 3, оно должно быть от 100 до 999. Итак, как это кодировать?
На изображении ниже:
Хочу решить вторую проблему.
Вот что я написал для первой задачи:
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
. Как я могу это сделать?
десять в степени n-1
даст нижний предел, в степени n
верхний (плюс / минус один) - например, Math.pow(10, n)
Для действительно больших чисел, скажем, более 10 цифр, вы можете генерировать одну цифру за другой и объединять их. Не самый быстрый подход, но он сработает.
Ваше изображение не синхронизируется с вопросом, который вы написали в своем сообщении. «Предположим, я беру параметр (длина int) и возвращаю String» Он просит принять входные данные как два целых числа и вернуть случайное число между min и max. Я опубликовал свой ответ в соответствии с вашим снимком экрана, так как это фактически заданный вам вопрос.
Я думаю, это должно сработать:
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)
@PushpeshKumarRajwanshi, где ты видел, что максимум будет 10? Просто используйте 9, и он отлично работает.
@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 при максимальном - минимальном
@PushpeshKumarRajwanshi Я полностью это понимаю. Дело в том, что вы делаете здесь предположение, о котором нигде не говорится. Если мы возьмем max
как наивысшее значение, которое реально может быть достигнуто, все в порядке. Одним из примеров может быть диапазон, заданный OP min = 100, max = 999.
@ Генри: Ну, это заявлено. Если вы видите снимок экрана в сообщении, он говорит: «Если мы передадим входные данные как 400 и 4000, этот метод должен вернуть любое число от 400 до 4000». Обратите внимание: любое число «между» и «между» означает исключение заданных минимальных и максимальных чисел. Ничего подобного серьезному. Это было всего лишь моим маленьким предложением, хотя концепция ответа верна.
Поскольку у вас уже есть фактическая логика генерации ограниченных случайных чисел в вашем вопросе, я предполагаю, что вы боретесь с вычислением границ.
Вы можете вычислить минимальное и максимальное значения, используя степень 10:
Так, например, для числа 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. Тогда как я могу это сделать?
Для 4 вы наверняка хотите от 1000 до 9999 вместо 9000? Что вам не подходит? Просто введите любую длину, которую хотите, при условии, что результирующие числа находятся в целочисленном диапазоне.
Мы используем 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, видя снимок экрана в сообщении.
как упомянул он, он хочет решить вторую проблему, а не первую, а вторая проблема принимает аргумент одной длины и возвращает случайное число с этой длиной.
В ЭТОЙ СТРОКЕ ПОКАЗАНА ЭТА ОШИБКА: = 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
Спасибо, @Amin. Решение проблемы: я добавляю один код в pom.xml = <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target > </properties>
Добро пожаловать. вы можете использовать Arrays.asList
вместо List.of
, и тогда вам больше не понадобится java 1.8.
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.
предыдущий ответ был опубликован до того, как вопрос был отредактирован. Теперь я отредактировал ответ по вопросу
Вам нужен этот метод,
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();
Итератор такой же, как и любой другой, поэтому вы можете играть с ним по своему желанию. Сообщите мне, если это не то, что вам нужно.
Это математический вопрос?