генерировать случайное число с ограничениями - PullRequest
4 голосов
/ 01 января 2011

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

Я напишу вопрос и после этого мой код,

"Напишите приложение, которое создает и печатает случайный номер телефона в форме XXX-XXX-XXXX. Включите тире в вывод. Не допускайте, чтобы первые три цифры содержали 8 или 9 (но не должны быть более строгими, чем это), и убедитесь, что второй набор из трех цифр не больше 742. Подсказка: продумайте самый простой способ создания номера телефона. Каждую цифру не нужно определять отдельно."

ОК, выделенное предложение - это то, на что я смотрю.Вот мой код:

import java.util.Random;
public class PP33 {
  public static void main (String[] args) {
    Random rand = new Random();

    int num1, num2, num3;

    num1 = rand.nextInt (900) + 100;
    num2 = rand.nextInt (643) + 100;
    num3 = rand.nextInt (9000) + 1000;

    System.out.println(num1+"-"+num2+"-"+num3);
  }
}

Как мне это сделать?Я нахожусь в главе 3, поэтому мы еще не обсуждали, являются ли операторы и так далее, но псевдонимы, класс String, пакеты, объявление импорта, случайный класс, класс Math, форматирование вывода (decimal- & numberFormat), Printf, перечисление и классы Wrapper + автобокс,Поэтому постарайтесь ответить на вопрос, основываясь только на этих предположениях, пожалуйста.

Код не содержит ошибок.

Спасибо!

Ответы [ 7 ]

8 голосов
/ 01 января 2011

Видя, что это домашняя работа, я чувствую, что нужно дать объяснение происходящему.

У вас есть три набора чисел, которые вам нужно сгенерировать.

К первому номеру предъявляются самые высокие требования. Он должен быть больше 100, но не содержать 8 или 9.

Вы гарантируете, что он всегда будет больше 100, используя:

(rand.nextInt(7)+1) * 100. 

Здесь написано, сгенерируйте случайное число от 0 до 6. Добавьте 1 к этому числу, чтобы убедиться, что оно никогда не будет 0. Так что, если оно выбирает 0, добавляется +1, делая его 1. Если оно выбирает 6, +1 добавляется 7, и т. д. Это удовлетворяет правилу № 1 и правилу № 2.

Вы гарантируете, что первое число никогда не будет иметь 8 или 9.

(rand.nextInt(8) * 10) + rand.nextInt(8)

Генерация случайного числа от 0 до 7. * 10 гарантирует, что он будет в десятой позиции, в то время как последняя помещает число в последнюю позицию.

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

package stackoverflow_4574713;

import java.text.DecimalFormat;
import java.util.Random;

public class Main {
         public static void main(String[] args) {

        Random rand = new Random();
        int num1 = (rand.nextInt(7) + 1) * 100 + (rand.nextInt(8) * 10) + rand.nextInt(8);
        int num2 = rand.nextInt(743);
        int num3 = rand.nextInt(10000);

        DecimalFormat df3 = new DecimalFormat("000"); // 3 zeros
        DecimalFormat df4 = new DecimalFormat("0000"); // 4 zeros

        String phoneNumber = df3.format(num1) + "-" + df3.format(num2) + "-" + df4.format(num3);

        System.out.println(phoneNumber);
    }
}

Выход:

662-492-1168
4 голосов
/ 01 января 2011

Для первых трех цифр вам нужно генерировать каждую цифру отдельно. См. Переменные i1, i2 и i3 ниже.

Для трех цифр должно работать любое число от 0 до 741.

Для окончательного набора из четырех цифр должно работать любое число от 0 до 9999.

Хитрость в том, как отформатировать вывод. Вы можете сделать это с помощью объекта NumberFormat, но я решил сделать это с помощью метода String.format(). В нем вы указываете, как вы хотите, чтобы каждый номер был отформатирован. Итак, я использовал формат строки "%d%d%d-%03d-%04d". %d вставляет в строку целое число в формате base-10. %03d гарантирует, что он имеет три символа в ширину, и что любое дополнительное пространство слева дополняется 0. Другими словами, 4 отформатирован как "004", а 27 отформатирован как "027". %04d работает аналогично, за исключением того, что его ширина составляет четыре символа.

Вот как вы все это собрали.

Random r = new Random();

int i1 = r.nextInt(8); // returns random number between 0 and 7
int i2 = r.nextInt(8);
int i3 = r.nextInt(8);
int i4 = r.nextInt(742); // returns random number between 0 and 741
int i5 = r.nextInt(10000); // returns random number between 0 and 9999

String phoneNumber = String.format("%d%d%d-%03d-%04d", i1, i2, i3, i4, i5);
System.out.println(phoneNumber);`
1 голос
/ 01 января 2011

Хм, просто очень простая идея изменить это значение на

num1 = rand.nextInt(8)*100 + rand.nextInt(8)*10 + rand.nextInt(8);
num2 = rand.nextInt(743);

. Для более простого вывода вы можете использовать DecimalFormat

DecimalFormat df3 = new DecimalFormat  ( "000" ); // 3 zeros
DecimalFormat df4 = new DecimalFormat  ( "0000" ); // 4 zeros
System.out.println(df3.format(num1)+"-"+df3.format(num2)+"-"+df4.format(num3));
.
0 голосов
/ 09 июня 2019
var num1 = Math.floor(Math.random()*7) + 1;
var num2 = Math.floor(Math.random()*8);
var num3 = Math.floor(Math.random()*8);
var part2 = Math.floor(Math.random()*742);
    if(part2 < 100){
    part2 = "0" + part2;
    }else if (part2 < 10) {
    part2= "00" + part2;
    }else{
    part2 = part2;
    }
var part3 = Math.floor(Math.random()*10000);
    if(part3 < 1000){
    part3 = "0" + part3;
    }else if (part3 < 100) {
    part3 = "00"+ part3;
    }else if(part3 < 10){
    part3 = "000" + part3;
    }else{
    part3 = part3;
    }
document.getElementById("demo").innerHTML= " " + num1 + num2 + num3 + "-" + part2 + "-" + part3;
0 голосов
/ 05 апреля 2016

Вы также можете проверить, что префикс не 555

0 голосов
/ 30 января 2013

У меня был тот же вопрос, что и в первом задании для моего класса Java, с оговоркой, что до этого момента мы могли использовать только те методы, которые мы изучили в классе. Поэтому мы не могли использовать метод .format. Вот что я придумал:

import java.util.Random;

/**
 *
 * @author 
 */
public class Randnum {

    /**
    * @param args the command line arguments
     */
    public static void main(String[] args) {

    Random num = new Random();
    int  num0, num1, num2, num3, num4, num5, num6, num7;

    num0 = num.nextInt(7) + 1;
    num1 = num.nextInt(8);
    num2 = num.nextInt(8);
    num3 = num.nextInt(643) + 101;
    num4 = num.nextInt(10);
    num5 = num.nextInt(10);
    num6 = num.nextInt(10);
    num7 = num.nextInt(10);

    String randnum= "A random phone number: ";
    System.out.print (randnum);
    System.out.print (num0);
    System.out.print (num1);
    System.out.print (num2);
    System.out.print ("-" + num3 + "-");
    System.out.print (num4);
    System.out.print (num5);
    System.out.print (num6);
    System.out.println (num7);

    }
}
0 голосов
/ 04 апреля 2012
public String GetRandomPhone(){
    return  String.format("(%03d) %03d-%04d", 
        (int) Math.floor(999*Math.random()), 
        (int) Math.floor(999*Math.random()),
        (int) Math.floor(9999*Math.random()));
}
...