编程练习题
豆机,也称为梅花瓶或高尔顿瓶,它是一个用来做统计实验的设备,以英国科学家弗兰克斯·高尔顿的名字来命名。它是一个三角形状的均匀放置钉子(或钩子)的直立板子,每个球都选取一个随机路径,然后掉入一个槽中。球从板子开口落下。每当球碰到钉子,它以
50
%
50\%
50% 的概率落向左边或落向右边。在板子底部的各个槽中都会堆积一堆球。如下图所示:
编写程序模拟豆机。程序应该提示用户输入球的个数以及机器的槽数。打印每个球的路径模拟它的下落。例如:在图(
b
b
b)中球的路径是 LLRRLLR ,而在图(
c
c
c)中球的路径是 RLRRLRR 。使用条形图显示槽中球的最终储备量。下面是程序的一个运行示例:
小球的个数:5
机器的槽数:8
R L R R R R R
R L R R L L R
R L L L L R L
R R L L R R L
R R R L L R L
| | | | |O| | | |
| | | | |O| | | |
| | |O| |O| |O| |
提示:创建一个名为 s l o t s slots slots 的数组。数组 s l o t s slots slots 中的每个元素存储的是一个槽中球的个数。每个球都经过一条路径落入一个槽中。路径上R的个数表示球落下的槽的位置。例如:对于路径 LRLRLRR 而言球落到 s l o t s [ 4 ] slots[4] slots[4] 中,而对路径 RRLLLLL 而言球落到 s l o t s [ 2 ] slots[2] slots[2] 中。
参考代码
import java.util.Scanner;
public class Game {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("小球的个数:");
int numberOfBalls = input.nextInt();
System.out.print("机器的槽数:");
int numberOfSlots = input.nextInt();
int[] slots = new int[numberOfSlots];
for (int i = 0; i < numberOfBalls; i++)
slots[onePath(numberOfSlots)]++;
printHistogram(slots);
}
private static int onePath(int numberOfSlots) {
int position = 0;
for (int i = 0; i < numberOfSlots - 1; i++)
if (Math.random() < 0.5)
System.out.print("L ");
else {
System.out.print("R ");
position++;
}
System.out.println();
return position;
}
private static void printHistogram(int[] slots) {
int maxSlotHeight = max(slots);
for (int h = maxSlotHeight; h > 0; h--) {
for (int slot : slots)
if (slot < h)
System.out.print("| ");
else
System.out.print("|O");
System.out.print("|");
System.out.println();
}
}
private static int max(int[] slots) {
int result = slots[0];
for (int i = 1; i < slots.length; i++) {
if (result < slots[i])
result = slots[i];
}
return result;
}
}