问题描述:
豆机,也称为梅花瓶或高尔顿瓶,它是一个用来做统计实验的设备,是用英国科学家瑟弗兰克斯高尔顿的名字来命名的。它是一个三角形状的均匀放置钉子(或钩子)的直立板子,如下图所示。
球都是从板子口落下的。每当球碰到钉子,它就有 50%的机会落向左边或落向右边。在板子底部的槽子中都会累积一堆球。编写程序模拟豆机。程序应该提示用户输入球的个数以及机器的槽数。打印每个球的路径模拟它的下落。例如:在图 b 中球的路径是LLRRLLR,而在图 c 中球的路径是 RLRRLRR。使用条形图显示橹中球的最终储备量。下面是程序的一个运行示例:
提示:创建一个名为 slots 的数组。数组 slots 中的每个元素存储的是一个槽中球的个数。每个球都经过一条路径落入一个槽中。路径上 R 的个数表示球落下的槽的位置。例如:对于路径 LRLRLRR 而言,球落到 slots[4]中,而对路径 RRLLLLL 而言,球落到 slots[2]中。
代码:
import java.util.Random;
import java.util.Scanner;
public class Test20 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter the number of balls to drop:");
int balls_number = in.nextInt(); //定义小球数量
System.out.print("Enter the number of slots in the bean machine:");
int slots_number = in.nextInt(); //定义机器槽数
String[][] track = new String[balls_number][slots_number-1];
int[] position = new int[balls_number]; //定义数组存储小球最终位置,存储小球右偏次数
track = trackOfBalls(balls_number,slots_number,position);
int[] slots = resultOfSlots(slots_number,position); //slots统计每个槽掉落的小球数
printTrack(track);
printOfSlots(balls_number,slots_number,slots);
in.close();
}
//返回0表示左,1表示右
public static int isLeftOrRight() {
Random r = new Random();
return r.nextInt(2);
}
//判断小球的下落情况
public static String[][] trackOfBalls(int balls_number,int slots_number,int[] position){
String[][] track = new String[balls_number][slots_number-1]; //定义数组存储小球下落轨迹
for(int i = 0; i < balls_number; i++) //外循环表示有多少个小球
{
for(int j = 0; j < slots_number - 1; j++) //内循环表示每个小球的下落轨迹
{
if(isLeftOrRight() == 0)
{
track[i][j] = "L";
}
else
{
track[i][j] = "R";
position[i]++;
}
}
}
return track;
}
//输出轨迹
public static void printTrack(String[][] track) {
for(int i = 0;i < track.length; i++)
{
for(int j =0; j < track[i].length; j++)
{
System.out.print(track[i][j]);
}
System.out.println();
}
}
//统计每个槽掉落的小球数
public static int[] resultOfSlots(int slots_number,int[] position) {
int[] slots = new int[slots_number]; //slots统计每个槽掉落的小球数
for(int i = 0; i < position.length; i++)
{
for(int j= 0; j < slots_number; j++)
{
if(j == position[i])
{
slots[j]++;
break;
}
}
}
//for(int i=0;i<slots.length;i++)
// System.out.print(slots[i]+" ");
//System.out.println();
return slots;
}
//输出每个槽中小球的情况
public static void printOfSlots(int balls_number,int slots_numbers,int[] slots) {
for(int i = balls_number; i > 0; i--)
{
for(int j = 0; j < slots_numbers; j++)
{
if(slots[j] < i)
System.out.print(" ");
else
System.out.print("O");
}
System.out.println();
}
}
}