2

我正在尝试自己学习 Java 编程(没有课程/教师/导师/等),所以这不是家庭作业。

我的问题在 Java 初学者挑战中已经提到过:在 while 循环中生成随机数,但是,正如之前提出这个问题的程序员所说,我在本书中的进展还不够深入,无法涵盖 ArrayLists。

回答这个问题肯定会帮助大多数初学者程序员更好地理解如何为 while 循环编写语句,这是一个通常复杂的过程,尤其是对于初学者。

问题是:编写一个while循环,生成1到100之间的随机数,并在两次生成相同的数字后停止循环。

正如您将认识到的,每次运行该程序时,运行该程序只会创建一个介于 1 和 100 之间的两个随机数的输出。我相信由于第 17 行而遇到此错误:equal = numberCheck == values[i]; 不正确,因为这是定义 while 循环条件何时变为真并因此停止评估的语句。

任何帮助是极大的赞赏。谢谢你。

我的代码是:

import java.util.Random;

public class SameNumber {

    public static void main(String args[]) {

        Random rand = new Random();
        int[] values = new int[100];
        int counter = 0;
        boolean equal = false;

        for (int i = 0; i < 2; i++) {
            values[i] = rand.nextInt(100) + 1;
            System.out.println(values[i]);
            int numberCheck;
        }

        while (!equal) {
            for(int i = counter - 1; i >= 0; i--) {
                int numberCheck = values[i];
                equal = numberCheck == values[i];
             //}
                if (!equal) {
                    System.out.println(rand.nextInt(100) + 1);
                }

                for (int j = counter - 1; j >= 0; j--) {
                    if (numberCheck  == values[j]) {
                        break;
                    }
                }
            }
        }
    }
}

PS:我知道这听起来很荒谬,但是我一直在研究这个问题大约一周并试图收集更多的研究,但我仍然无法找到正确的解决方案。我一直犹豫寻求帮助,因为我担心其他程序员会用我还没有学过的方法来回答。

4

4 回答 4

3

您的方法非常间接......让我们直接按照说明进行尝试:

  1. 生成一个新的随机数
  2. 确定你以前是否见过这个随机数
  3. 不?记录你已经看到这个随机数并转到 1。
  4. 是的?停止

那么真正的问题是,“我如何确定我以前是否见过随机数?”。

由于它是一个有限集,因此您可以拥有一个boolean seen[100]初始化为 false 的布尔数组 ( )。每当您看到一个数字时,标记seen[<number>]true。如果seen[<number from 2>]曾经是真的,那么您之前已经生成过它。

顺便说一句,使用 anArrayList来跟踪这些东西并不是数据结构的最佳选择。当您准备好查看 Java 集合时,请查看HashSet,它具有恒定时间(不取决于列表的大小)执行contains.

于 2012-08-16T22:32:11.103 回答
1

我将设置values为一个布尔值数组,如果您的号码在那里,则将其设置为 true。然后,您只需使用随机数作为该数组的索引

boolean[] values = new boolean[100];

int index = Random.nextInt(100);
while(!values[index]){
    System.out.println(index+1);
    values[index] = true;
    index = Random.nextInt(100);
}
于 2012-08-16T22:34:03.687 回答
0

试试这个: 1. 创建一个介于 0 到 100 之间的随机数 2. 如果它不在列表中,则将其添加到列表中。3.如果新生成的数字已经在arraylist里面了就停止

import java.util.ArrayList;
import java.util.Random;

public class SameNumber {
    public static void main(String args[]) {
        Random rand = new Random();
        ArrayList<Integer> list=new ArrayList<Integer>();       
        int newRand=rand.nextInt(100);
        while(!list.contains(newRand)){
            list.add(newRand);
            newRand=rand.nextInt(100);
        }
        System.out.print(list);
    }
}
于 2012-08-16T22:32:02.960 回答
0

即使这不是家庭作业(我希望这不会引发自称是非家庭作业的家庭作业问题的趋势),但我仍然认为您更能得到指针的帮助,而不是解决方案。

我会用伪代码英语重写你的代码实际上做了什么,这样你就可以看到哪里出错了。

创建一个随机数生成器
创建一个 100 个元素的数组
初始化一个计数器
初始化一个布尔值
循环两次并将两个随机数分配给第一个
     100 元素数组中的两个元素(这是一个问题)
在循环中:打印出分配的数字的值
在循环中:编译器将忽略的无意义行
开始一个循环,直到上面初始化的布尔值变为真
开始一个循环,将计数变量初始化为-1,
    当它大于或等于零时将停止,减少它
    每次(这意味着这将永远不会运行)。
在循环中:引用数组中的非法位置(-1 及以下)
    并将其分配给一个变量(这是一个问题)
在循环中:检查您刚刚分配的变量是否等于
    你刚刚分配了它(这是一个问题)
在循环中:如果没有(那不可能发生)打印出一些随机数
    与迄今为止发生的任何事情无关(这是一个问题)
在循环中:启动一个嵌套循环,其问题与另一个循环相同
在嵌套循环中:检查所有值
    (尽管它们被非法引用)在数组中等于数字
    从外环拉出。[这有点意思,但只有
    到目前为止有太多问题甚至无法考虑纠正这条线]
于 2012-08-16T22:55:52.950 回答