diff --git a/PaulResults.md b/PaulResults.md new file mode 100644 index 0000000..be9f8ee --- /dev/null +++ b/PaulResults.md @@ -0,0 +1,16 @@ +*** +Simulation of 2 dice tossed for 1000000 times. +*** + + 2: 27588: 0.03 ** + 3: 55346: 0.06 ***** + 4: 83377: 0.08 ******** + 5: 110439: 0.11 *********** + 6: 139244: 0.14 ************* + 7: 167051: 0.17 **************** + 8: 139601: 0.14 ************* + 9: 111389: 0.11 *********** + 10: 82921: 0.08 ******** + 11: 55351: 0.06 ***** + 12: 27693: 0.03 ** + diff --git a/pom.xml b/pom.xml index 7219542..107e8e9 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,18 @@ com.zipcodewilmington Dicey-Lab 1.0-SNAPSHOT + + + junit + junit + RELEASE + test + + + + 8 + 8 + \ No newline at end of file diff --git a/src/main/java/Bins.java b/src/main/java/Bins.java index b9da83e..bab4754 100644 --- a/src/main/java/Bins.java +++ b/src/main/java/Bins.java @@ -1,4 +1,20 @@ +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class Bins { + Map binmap; + public Bins(int min , int max){ + this.binmap = Stream + .iterate(min,q -> q + 1) + .limit(max) + .collect(Collectors.toMap( q -> q, q-> 0)); + } + public Integer getBin(int bin){ + return this.binmap.get(bin); + } + public void increment(int bin){ + this.binmap.replace(bin,this.binmap.get(bin)+1); + } } diff --git a/src/main/java/Dice.java b/src/main/java/Dice.java index 2283c96..985e3fc 100644 --- a/src/main/java/Dice.java +++ b/src/main/java/Dice.java @@ -1,4 +1,33 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + public class Dice { + private static class Die{ + private int result; + private Die(){ + this.result =(int) (Math.random()*(6 - 1 + 1) + 1); + } + private int roll(){ + return (this.result = (int) (Math.random()*(6 - 1 + 1) + 1)); + } + } + private final List dice; + public Dice(int numberOfDice){ + dice = Stream + .generate(Die::new) + .limit(numberOfDice) + .collect(Collectors.toList()); + } + public int tossAndSum(){ + return dice.stream() + .mapToInt(Die::roll) + .sum(); + } + public List getDice(){ + return dice; + } } diff --git a/src/main/java/Simulation.java b/src/main/java/Simulation.java index 73d86e8..f16e711 100644 --- a/src/main/java/Simulation.java +++ b/src/main/java/Simulation.java @@ -1,5 +1,58 @@ -public class Simulation { +import com.sun.nio.sctp.SctpMultiChannel; + +import java.util.stream.Stream; +public class Simulation { + private final Bins bins; + private final Dice dice; + private final int rolls; + private final int numDice; + public Simulation(int dice, int rolls) { + this.numDice = dice; + this.dice = new Dice(dice); + this.bins = new Bins(dice,dice * 6); + this.rolls = rolls; + } + public void runSimulation(){ + Stream + .iterate(0,q-> q+1) + .limit(rolls) + .forEach(q-> { + int bin = dice.tossAndSum(); + bins.increment(bin); + }); + } + public String printResults() { + StringBuilder sb = new StringBuilder(); + sb + .append("***\n" + "Simulation of ") + .append(this.numDice) + .append(" dice tossed for ") + .append(this.rolls) + .append(" times.\n") + .append("***\n") + .append("\n"); + Stream + .iterate(this.numDice,q -> q + 1) + .limit((this.numDice) * 6L - 1) + .forEach(q -> { + sb + .append(String.format("%3s",q)) + .append(String.format(":%9s",this.bins.getBin(q))) + .append(String.format(":%5.2f ", (double)(this.bins.getBin(q))/(double)(this.rolls))); + Stream + .iterate(0,r->r+1) + .limit(this.bins.getBin(q)/10_000) + .forEach(r -> sb.append("*")); + sb.append("\n"); + }); + return sb.toString(); + } + public static void main(String[] args) { + Simulation sim = new Simulation(2,1_000_000); + sim.runSimulation(); + System.out.println(sim.printResults()); + } } diff --git a/src/test/java/BinsTest.java b/src/test/java/BinsTest.java new file mode 100644 index 0000000..78460c2 --- /dev/null +++ b/src/test/java/BinsTest.java @@ -0,0 +1,28 @@ +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Optional; +import java.util.stream.Stream; + +public class BinsTest { + private Bins bins; + @Before + public void setUp(){ + bins = new Bins(2,12); + } + @Test + public void constructorAndGetTest(){ + Stream + .iterate(2,q -> q+1) + .limit(12) + .forEach(q-> Assert.assertEquals(Integer.valueOf(0), bins.getBin(q))); + } + @Test + public void incrementTest(){ + bins.increment(2); + Assert.assertEquals(Integer.valueOf(1),bins.getBin(2)); + } + + +} diff --git a/src/test/java/DiceTest.java b/src/test/java/DiceTest.java new file mode 100644 index 0000000..93c63b9 --- /dev/null +++ b/src/test/java/DiceTest.java @@ -0,0 +1,19 @@ +import org.junit.Assert; +import org.junit.Test; + +public class DiceTest { + @Test + public void constructorTest(){ + //when + Dice dice = new Dice(2); + //then + Assert.assertEquals(2,dice.getDice().size()); + } + @Test + public void tossAndSumTest(){ + //given + Dice dice = new Dice(2); + Assert.assertTrue(dice.tossAndSum() >= 2 && dice.tossAndSum() <= 12); + } + +} diff --git a/src/test/java/SimulationTest.java b/src/test/java/SimulationTest.java new file mode 100644 index 0000000..45927a6 --- /dev/null +++ b/src/test/java/SimulationTest.java @@ -0,0 +1,16 @@ +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class SimulationTest { + private Simulation sim; + @Before + public void setUp(){ + sim = new Simulation(2,1_000_000); + } + @Test + public void simulatorTest(){ + sim.runSimulation(); + Assert.assertNotNull(sim.printResults()); + } +}