Как «стереть» числа, чтобы иметь только первую цифру числа

#java #spacing

#java #интервал

Вопрос:

Если моя переменная является случайным числом от 0 до 6294, как я могу заставить свой вывод печатать ТОЛЬКО первую переменную?

Мой код для случайного числа

 int random = (int)(Math.random() * 6294);
  

Например, если он выдает 3542, я хочу, чтобы он просто сказал 3. Если он выдает 865, я хочу, чтобы он сказал 8. Я не знаком с Java, но я думал, что это как-то связано с межстрочным интервалом? Что-то связано с командами %d, %f, %s? Я не уверен, поэтому любое понимание будет с благодарностью!

РЕДАКТИРОВАТЬ ** Нет его части учебного пособия, которое выпустил мой профессор. Вот почему его число находится в диапазоне 0-6294. Я просто не знаю, как это выяснить, если число когда-либо меняется.

Комментарии:

1. Если вам нужна только одна цифра, почему вы рандомизируете многозначные числа?

2. Это предполагает, что оператору не нужен номер отверстия, однако, возможно, ему нужна 1 цифра для этого конкретного вывода, но все еще используется для целого числа позже в коде.

3. @Athamas Учитывая его пример, он немедленно выбрасывает это случайное число. Он забывает о других цифрах!

4. Я не понимаю, как «узнать, меняется ли число», приводит к «печатать только первое число». Почему бы просто не распечатать все это и посмотреть, меняется ли оно?

5. Нет, это часть учебного пособия, которое выпустил мой профессор. Вот почему его число находится в диапазоне 0-6294. Я просто не знаю, как это выяснить, если число когда-либо меняется.

Ответ №1:

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

Затем вы можете безопасно преобразовать его обратно в число.

Например

 // assuming the output
int random = 3542;
// getting 1st character only
String truncated = String.valueOf(random).substring(0,1);
// parsing new int
int newRandom = Integer.parseInt(truncated); // ==> 3
  

Примечание

Если вам нужна только первая цифра, скорее всего, вам не нужно рандомизировать так, как вы делаете в настоящее время.

Комментарии:

1. преобразование в строку, а затем из строки, кажется, не будет слишком производительным

2. @P.J.Meisch, вероятно, лучше, чем математика.

Ответ №2:

Как сказал @Berger, было бы проще просто сгенерировать случайное число от 1 до 10:

 Random r = new Random();
int random = r.nextInt(10)   1
  

Ответ №3:

Есть много способов сделать это. Тот, который мне нравится, делит число до тех пор, пока число больше 9:

 int first_digit(int n) {
  while (Math.abs(n) > 9) {
    n /= 10;
  }
  return n;
}
  

Вы можете выполнить некоторую базовую математику. Запись в базе 10 числа дает количество цифр, которое имеет число. Деление числа на 10 до степени числа цифр минус единица перемещает десятичную точку влево:

 int first_digit_v2(int x) {
  return x / (int)Math.pow(10, (int)Math.log10(x));
}
  

Может быть проще просто выбросить случайное число от 1 до 9, но распределение вероятностей не будет таким же, как при использовании первой цифры числа. Это связано с законом Бенфорда.

Ответ №4:

Предполагая, что есть веская причина для усечения, а не просто для генерации меньшего случайного числа (как предлагали другие), вы можете разобрать int в строку и получить первый символ / цифру со следующим:

 //get random number
int random = (int)(Math.random() * 6294);

//print out just the first digit
System.out.println(String.valueOf(random).charAt(0));
  

То же, что и ответ Mena, но charAt(0) вместо substring(0,1)

Ответ №5:

вместо усечения генерируйте только то, что вам нужно … int между 0 и 9

 int random = (int)(Math.random() * 10);
  

Ответ №6:

Зачем делать все обходные пути? Почему вы хотите создать 4-значный номер; когда вас интересует только первый ?!

Видите ли, по сути, тогда запрашивается случайное число от 0 до 6. (или, следуя вашей идее использования 8 из 865; 0 и 9).

Просто выберите Random.nextInt() затем, например:

 int randomValueBetween0And9 = new Random().nextInt(7);
  

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

Комментарии:

1. Вероятно. Вопрос: действительно ли это имеет значение? И не было бы проще понять распределение такого решения «nextInt ()»; по сравнению с выборкой «первого символа» из 3 или 4-значной строки ?!

2. Я предполагаю, что OP специально выбрал эту схему генерации чисел для достижения определенного распределения. Следовательно, нет смысла говорить ему, чтобы он просто использовал другой дистрибутив для упрощения процедуры вывода…

3. Он не выбирал это число, оно было дано ему. И да, в узком смысле это делает мой ответ менее полезным. Но в этом смысле … возможно, мой ответ — это мотивация для OP обратиться к человеку, который дал ему этот номер, чтобы понять, какова именно цель всего этого.

4. Это называется законом Бенфорда, en.wikipedia.org/wiki/Benford’s_law