【问题标题】:Generating Random Numbers in For Loop from External Class从外部类在 For 循环中生成随机数
【发布时间】:2016-12-05 21:07:40
【问题描述】:

首先,如果之前有人问过这个问题但我找不到,我深表歉意。我在互联网的深处搜寻了一些指导,但没有成功。

在我的编程 II 课上,我们正在为彩票创建一个程序。我们已经创建了外部类(在课堂上做了)并在我们的驱动程序中使用了这些类中创建的对象。对于这个任务,我们正在创建一个输出彩票号码的程序。该程序询问用户他们是否在玩 Pick 3、4 或 5,然后应该为每个“球”输出一个随机数。在其中一个单独的类中,我们已经导入并实例化了随机化器。但是,当我对数组和 for 循环进行编程时,虽然它生成了正确数量的打印输出(3 个打印输出为 3,4 个打印输出为 4,5 个打印输出为 5),但不会为每个循环生成一个新数字。相反,它保留第一个值并在之后的每个循环中打印出来。我在下面包含了我的代码。请帮忙!

import java.util.Scanner;

public class LotteryGame2 {

  public static void main(String[] args){

    //Declare and instantiate objects
    PickGame2 pick = new PickGame2();
    Scanner keyboard=new Scanner(System.in);
    pick.activate();

    //Ask for and obtain user input
    System.out.print("Are you playing Pick 3, Pick 4, or Pick 5? Enter number here: ");
    int numberOfGame=keyboard.nextInt();
    PickGame2[] gamenumber=new PickGame2 [numberOfGame];

    for (int i=0; i<gamenumber.length; ++i){
        int ball=pick.pullBall();
        System.out.println("Ball " + (i+1) + " is " + ball);
    }//Ending bracket of for loop

    //Close Scanner object
    keyboard.close();

  }//Ending bracket of main method
}//Ending bracket of class LotteryGame2

外部类如下:

private int ball;
private Random randomizer;

public LotteryContainer(){
    this.ball=0;
    this.randomizer=new Random();
}//Ending bracket of constructor

public void activate(){
    this.ball=this.randomizer.nextInt(9) + 1;
}//Ending bracket of method activate

public int getBall(){
    return this.ball;
}//Ending bracket of method getBall

和

private LotteryContainer machine;

public PickGame2(){
    this.machine=new LotteryContainer();
}//Ending bracket of constructor

public void activate(){
    this.machine.activate();
}//Ending bracket of method activate

public int pullBall(){
    return this.machine.getBall();
}//Ending bracket of pullBall

【问题讨论】:

  • 您展示的代码创建了一个数组并对其进行迭代。但是没有对任何数组元素进行单一分配。你是不是缺少gamenumber[i] = ... 之类的东西?!
  • 外部类:{私有 LotteryContainer 机器; public PickGame2(){ this.machine=new LotteryContainer(); } public void activate(){ this.machine.activate(); } public int pullBall(){ return this.machine.getBall(); } } 导入 java.util.Random;公共类 LotteryContainer { 私有 int 球;私人随机随机器;公共 LotteryContainer(){ this.ball=0; this.randomizer=new Random(); } public void activate(){ this.ball=this.randomizer.nextInt(9) + 1; } public int getBall(){ return this.ball;}
  • @GhostCat,我不确定你说它没有任何任务是什么意思。 gamenumber 完全取决于用户输入,然后根据该输入,for 循环打印出它需要的任意数量的球。
  • 首先:不要将信息放入不可读的cmets中。而是更新您的问题。问题是;鉴于您当前的输入,根本无法猜测发生了什么。
  • @GhostCat,真的没有必要粗鲁。我只是寻求帮助,让我的代码生成随机数。其他一切都运行良好,没有出现任何错误。

标签: java loops random


【解决方案1】:

如果您查看PickGame2 类,您会发现它使用LotteryContainer 来挑选球。 LotteryContainer 有两种方法 - 一种为球选择一个号码 (activate),另一种返回被选中的球号 (getBall)。因为你只在PickGame2 中调用pullBall,而pullBall 只从LotteryContainer 调用getBall,这意味着你永远不会调用activate 方法来获得一个新球。

在每次调用 pullBall 之前添加对 activate 的调用,每次都会打印出不同的号码。

(实际上,随机数生成器可以多次生成相同的数字。我不知道您的作业规范是什么,但如果它应该模拟每个球不同的“真实”彩票,那么仅仅生成随机数并显示它们是不够的)。

【讨论】:

  • 所以即使它在程序开始时已激活实例化,我也需要将它添加到我的循环中?一开始我以为只是随机出现了三个相同的数字,但是在运行程序几次后,我意识到这个数字是在第一次循环时获得的,然后在后续循环中被保留。跨度>
  • @SMcGwier 是的 - 看看这些方法的作用。 getBall 方法只返回字段的当前值。它不会更改字段,也不会对随机数生成器做任何事情。因此,除非您再次调用activate,否则它将始终返回相同的值。计算机程序只做它所写的,不多也不少。
  • 非常感谢!我现在意识到,如果我为整个程序激活了循环,我就不必将第二个激活放在那里,但这不是我需要程序运行的方式。我是编程新手(显然),因此非常感谢我收到的任何帮助。
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多