import java.util.Arrays;
import java.util.Random;
public class TicketSimulation {
private final double ticketPrice;
private final double winProbability;
private final int numberOfTrials;
private final Random random;
private double[] simulationResults;
public TicketSimulation(double ticketPrice, double winProbability, int numberOfTrials) {
this.ticketPrice = ticketPrice;
this.winProbability = winProbability;
this.numberOfTrials = numberOfTrials;
this.random = new Random();
this.simulationResults = new double[numberOfTrials];
}
/**
* Simulates one experiment: buys tickets until winning
* @return total cost spent
*/
private double simulateOneExperiment() {
int ticketsBought = 1; // At least one ticket
// Keep buying tickets until we win
while (random.nextDouble() > winProbability) {
ticketsBought++;
}
return ticketsBought * ticketPrice;
}
/**
* Complete all trials
*/
public void runSimulation() {
for (int i = 0; i < numberOfTrials; i++) {
simulationResults[i] = simulateOneExperiment();
}
}
/**
* @return mean cost
*/
public double calculateMean() {
double sum = 0;
for (double cost : simulationResults) {
sum += cost;
}
return sum / numberOfTrials;
}
/**
* @return variance
*/
public double calculateVariance() {
double mean = calculateMean();
double sumSquaredDiff = 0;
for (double cost : simulationResults) {
double diff = cost - mean;
sumSquaredDiff += diff * diff;
}
return sumSquaredDiff / numberOfTrials; // Sample variance
}
/**
* @return standard deviation
*/
public double calculateStandardDeviation() {
return Math.sqrt(calculateVariance());
}
public void printResults() {
System.out.println("");
System.out.println("## TICKET SIMULATION RESULTS");
System.out.println();
System.out.printf("Ticket Price: $%.2f%n", ticketPrice);
System.out.printf("Win Probability: %.2f%%%n", winProbability * 100);
System.out.printf("Number of Trials: %,d%n%n", numberOfTrials);
double mean = calculateMean();
double stdDev = calculateStandardDeviation();
System.out.printf("Mean Cost: $%.2f%n", mean);
System.out.printf("Standard Deviation: $%.2f%n", stdDev);
}
public static void main(String[] args) {
TicketSimulation t;
int trials = 1000000;
t = new TicketSimulation(60.0, 0.15, trials);
t.runSimulation();
t.printResults();
t = new TicketSimulation(60, 0.09, trials);
t.runSimulation();
t.printResults();
t = new TicketSimulation(20, 0.06, trials);
t.runSimulation();
t.printResults();
}
}