高尔顿盒;打印直方图

时间:2014-11-24 19:03:16

标签: java arrays loops

嘿伙计们我正在写一个家庭作业的程序来展示一个高尔夫球盒中的球的路径

http://i.stack.imgur.com/Ltypc.png

到目前为止,我的程序会选择要丢弃的球数,以及框底部的插槽数量,并显示球所采用的随机路径。

我遇到的问题是创建描绘最终结果的直方图。 我发现的一条重要信息是,每当球落到右侧时,它就会移动到一个位置。因此,如果print语句是LRLRLR,那么由于3 R,它将位于第3个插槽中。

它可以打印的随机直方图的一个例子:

http://i.stack.imgur.com/zCotG.png

public class Set_8_P6_21 {

public static void main(String[] args) {

    // Declaring variables and calling scanner
    int balls, slots;

    System.out.println("Enter the amount of balls to drop: ");

    Scanner input = new Scanner(System.in);
    balls = input.nextInt();

    System.out.println("Enter the amount of slots: ");
    slots = input.nextInt();


    char[] arrayslot = new char[slots-1];
    int[] arraypattern = new int[slots-1];

    // Nested loop that runs the amount of balls through the machine, and through the amount of slots. 
    for (int i = 0; i < balls; i++) {
        System.out.println();

        for (int j = 0; j < slots-1; j++) {

            double k = Math.random();

            if (k < 0.5) {
                arrayslot[j] = 'L' ;
                arraypattern[j] = 1; // This is where I am trying to make my histogram
            }

            else if (k >= 0.5) {
                arrayslot[j] = 'R';
                arraypattern[j] = 0; // This is where I am trying to make my histogram
            }

            System.out.print(arrayslot[j]);

        }

    }}}

如果有人知道如何使用来自循环的信息进行此打印,那将非常有帮助,感谢您抽出宝贵时间阅读本文。

1 个答案:

答案 0 :(得分:1)

首先,您不需要保留数组arrayslot,因为您立即打印数组元素,之后您不会对其执行任何操作。所以你可以打印角色:

            if ( k < 0.5 ) {
                System.out.print("L");
            } else {
                System.out.print("R");
            }

正如您所注意到的,也不需要else if。 k小于0.5,或者大于0.5。所以你可以使用else

为了确定球将落入哪个位置,您需要计算R s。要做到这一点,你只需要在每个球的模拟开始时得到0 int,然后当你滚动一个&#34; R&#34;以上。所以你的循环扩展为:

    for (int i = 0; i < balls; i++) {
        int ballSlot = 0;

        for (int j = 0; j < slots - 1; j++) {

            double k = Math.random();

            if ( k < 0.5 ) {
                System.out.print("L");
            } else {
                System.out.print("R");
                ballSlot++; 
            }

        }

        System.out.println();
    }

但是,当然,如果我们这样做,那么价值就不会到达任何地方,在我们完成模拟球之后我们会失去它。你想要做的是保持一个数组,它保持我们每个插槽的次数。因此,在每个球的模拟结束时,当我们知道它落入哪个槽时,我们将1添加到给定的槽中。如果我们在同一个插槽中播放3次,我们在阵列中的那个位置会有3个:

    int[] frequencies = new int[slots];

    // Nested loop that runs the amount of balls through the machine, and
    // through the amount of slots.
    for (int i = 0; i < balls; i++) {
        int ballSlot = 0;

        for (int j = 0; j < slots - 1; j++) {

            double k = Math.random();

            if ( k < 0.5 ) {
                System.out.print("L");
            } else {
                System.out.print("R");
                ballSlot++; 
            }

        }

        frequencies[ballSlot]++;
        System.out.println();
    }

现在,为了正确打印直方图,您必须从最高的列开始,然后向下工作直至到达&#34;地板&#34;在直方图中,为每个在该频率上有球的槽打印O。例如,如果插槽4和5中有3个球,插槽2中有1个球,则从最高频率3开始:

  • 对于频率3,请在第4和第5位置打印O
  • 对于频率2,此高度没有新的位置,但您必须再次在第4和第5位打印O,否则您只会在{4}的顶部有O列,而不是它的整个高度。
  • 对于频率1,您可以在第2,第4和第5位置打印O

所以为了做到这一点,我们必须首先找出哪个频率最高。您可以扫描阵列,但实际上,您可以在进行模拟时计算它:

    int[] frequencies = new int[slots];
    int maxFrequency = 0;

    // Nested loop that runs the amount of balls through the machine, and
    // through the amount of slots.
    for (int i = 0; i < balls; i++) {
        int ballSlot = 0;

        for (int j = 0; j < slots - 1; j++) {

            double k = Math.random();

            if ( k < 0.5 ) {
                System.out.print("L");
            } else {
                System.out.print("R");
                ballSlot++; 
            }

        }

        frequencies[ballSlot]++;
        if ( frequencies[ballSlot] > maxFrequency ) {
            maxFrequency = frequencies[ballSlot];
        }
        System.out.println();
    }

如您所见,如果任何频率高于我们目前maxFrequency的频率,我们会将其保留为新的maxFrequency

现在,打印直方图:

    for ( int i = maxFrequency; i > 0; i-- ) {
        for ( int j = 0; j < slots; j++ ) {
            if ( frequencies[j] >= i ) {
                System.out.print( "O");
            } else {
                System.out.print( " ");
            }
        }
        System.out.println();
    }

对于我们在这个级别没有球的每个位置,我们打印一个空格。对于我们有球的位置,我们打印O

变量i表示我们正在绘制的直方图的当前高度。因此条件if ( frequencies[j] >= i )表示如果在此位置,我们至少有与当前高度一样多的球。

那就是它。在模拟循环之前和直方图循环之前添加System.out.println()到输入,模拟和直方图之间的空格,您就完成了。