生成有限制的随机数

时间:2011-01-01 16:33:42

标签: java math random

我是一般的编程新手,所以我试图在这个问题上尽可能具体。 这本书我正在做一些练习。我设法做了他们所说的一半以上,但这只是我一直在努力寻找的一个输入。

我会写问题,然后是我的代码,

“编写一个创建并打印表格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章,所以我们还没有讨论if语句等,但别名,String类,包,导入声明,随机类,数学类,格式输出(decimal-& numberFormat),Printf,Enumeration&包装类+自动装箱。因此,请考虑仅根据这些假设回答问题。

代码没有任何错误。

谢谢!

7 个答案:

答案 0 :(得分:8)

看来这似乎是作业,我觉得应该给出正在发生的事情的解释。

您需要生成三组数字。

第一个数字的要求最高。它必须大于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

答案 1 :(得分:4)

对于前三位数字,您需要分别生成每个数字。请参阅下面的变量i1,i2和i3。

对于三位数,0到741之间的任何数字都应该有效。

对于最后一组四位数,0到9999之间的任何数字都应该有效。

这里的技巧是如何格式化输出。您可以使用NumberFormat对象执行此操作,但我选择使用String.format()方法执行此操作。在其中,您可以指定希望如何格式化每个数字。所以,我使用了格式字符串"%d%d%d-%03d-%04d"%d将基数为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);`

答案 2 :(得分:1)

嗯,只是一个非常简单的想法,将其改为

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));

答案 3 :(得分:0)

我有同样的问题作为我的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);

    }
}

答案 4 :(得分:0)

您可能还想检查前缀不是555

答案 5 :(得分:0)

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;

答案 6 :(得分:-2)

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()));
}