I could not find a solution from my book's website (student-level access) but I feel that I am missing something that I'm supposed to learn from this exercise.
Instructions: Balls are dropped from the opening of the board. Every time a ball hits a nail, it has a 50% chance of falling to the left or to the right. The piles of balls are accumulated in the slots at the bottom of the board.
Book's example:
Enter the number of balls to drop: 5 Enter the number of slots in the bean machine: 7 LRLRLRR RRLLLRR LLRLLRR RRLLLLL LRLRRLR 0 0 000
My attempt:
import java.util.*;
public class BeanMachine {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter number of balls to drop: ");
int numberOfBalls = input.nextInt();
System.out.print("Enter the number of slots in the bean machine: ");
int numberOfSlots = input.nextInt();
//Simulate drops
int[] slots = new int[numberOfSlots];
for (int i = 0; i < numberOfBalls; i++) {
simulateDrop(slots);
}
//Display histogram
for (int i = numberOfBalls; i > 0; i--) {
for (int j = 0; j < slots.length; j++) {
if (slots[j] >= i) {
System.out.print("0");
}
else {
System.out.print(" ");
}
}
System.out.println();
}
}
public static void simulateDrop(int[] slots) {
StringBuilder path = new StringBuilder(slots.length);
int slotIndex = 0;
int numberOfNails = slots.length - 1;
for (int i = 0; i < numberOfNails; i++) {
int direction = (int)(Math.random() * 2);
if (direction == 0) {
path.append("L");
}
else {
path.append("R");
slotIndex++;
}
}
System.out.println(path.toString());
slots[slotIndex]++;
}
}
-
1\$\begingroup\$ What is the goal here? How do you know if your program works correctly? (Does it?) \$\endgroup\$janos– janos2015年08月23日 06:04:48 +00:00Commented Aug 23, 2015 at 6:04
-
\$\begingroup\$ @janos The question seems clear enough. The code appears to work as advertised. \$\endgroup\$200_success– 200_success2015年08月23日 08:08:13 +00:00Commented Aug 23, 2015 at 8:08
-
\$\begingroup\$ @Legate have you read the Wikipedia article? I'm not sure if your program simulates one of those (it may, but I'm not convinced). \$\endgroup\$mkrieger1– mkrieger12015年08月23日 08:24:44 +00:00Commented Aug 23, 2015 at 8:24
-
1\$\begingroup\$ I thing you shouldn't try to find an easy solution by writing two methods but a clean solution with OOP. Separate input, presentation and business logic. \$\endgroup\$Obenland– Obenland2015年08月23日 22:23:02 +00:00Commented Aug 23, 2015 at 22:23
-
\$\begingroup\$ There are two things that seem to be off here: 1. you never touch the slotIndex in your simulateDrop method 2. you initialize your slotIndex with 0 does a ball really drop into the 0th slot if it would drop straight down passing through each nail miracoulusly? \$\endgroup\$Aron_dc– Aron_dc2015年08月28日 07:45:36 +00:00Commented Aug 28, 2015 at 7:45
1 Answer 1
Java has good support for OOP techniques - Using these will allow you to create a more elegant solution. Your code could be refactored with the correct use of these techniques to produce something of the form:
PegMachine sampleTest = PegMachine(500,100);
sampleTest.histogram;
This approach hides the complexities of the program and allows you to conduct tests by simply creating a PegMachine specifying the number of pegs and balls for each sample.
I noticed Aron_dc pointed out the slotIndex variable in your simulateDrop method is never used - This can be removed as it does not contribute anything to your program.
Out of curiosity I conducted a larger sample using your code to see if it produced the correct normal-distribution curve. The results were as expected; confirming your codes correctness.
Besides suggesting the use of object orientation your code seems well written and correct.
Explore related questions
See similar questions with these tags.