my bad, when i thought again, the sequential guessing implicitly makes P(right at i|wrong all before)=P(right at i) as wrong prior to i is a necessity rather than information for i event to happen.
P(right by n) =
P(right by n) =
import java.util.Scanner;
/**
* Eck's book Chapter 4 PlayGame class
* @version 1.0
* @since 2019-11-1
*/
public final class NumberGuessingGame{
static int totalPlay;
static int totalWin;
static int guessPermitted = 6; //# of guess permitted per game
public static void main(String[] args){
System.out.println("This game is very easy.");
System.out.println("I will pick a number between 1 and 100, and you guess it.");
System.out.println("If you don't get it within "+ guessPermitted + " times, you are a fucking loser.");
System.out.println("Now, let's rock and roll baby!");
boolean playAgain;
String playAgainString;
do{
System.out.println("I rolled my dice. Let's see if you get it.");
totalPlay++;
PlayNumberGuessingGame();
System.out.println("Play again?");
Scanner scanner = new Scanner(System.in);
playAgainString = scanner.next();
playAgainString = playAgainString.substring(0,1).toUpperCase();
playAgain = (playAgainString.equals("Y")) ? true : false;
} while(playAgain);
double expectedWinRatio = NumberGuessingGameSim.NumberGuessingGameSim(guessPermitted);
double actualWinRatio = (double)totalWin*100/totalPlay;
String performance = (actualWinRatio>expectedWinRatio) ? ("outperformed") : ("underperformed");
System.out.println("You have won " + totalWin + " games out of the total of " + totalPlay + " games played.");
System.out.println("Your win ratio is " + String.format("%.1f", actualWinRatio) +"%, which " + performance + " the average of "+expectedWinRatio+"%");
System.out.println("Thanks for playing. Have a fucking good day!");
}
static void PlayNumberGuessingGame(){
int answer, guess, guessCount;
answer = (int)(Math.random() * 100) + 1;
guessCount = 0;
while(guessCount < guessPermitted){
Scanner guessScan = new Scanner(System.in);
System.out.println("What's your guess?");
guess = guessScan.nextInt();
if (guess == answer){
break;
}
else if (guess < answer)
System.out.println("Wrong, guess is too low.");
else System.out.println("Wrong, guess is too high.");
guessCount++;
} //at this point, either guessCount has reached the quota or the guess is right
if (guessCount == 6)
System.out.println("Sorry, you lost. My dice number was " + answer + ".");
else {
totalWin++;
System.out.println("Congratulations! You got it in " + (guessCount+1) + " guesses. What a genius.");}
}
}
import java.util.Scanner;
public class NumberGuessingGameSim{
static int totalWin = 0;
static int totalRun = 100000;
public static void main(String[] args){
int guessPermitted;
Scanner guessScan = new Scanner(System.in); //getting # of guesses allowed in each game
System.out.println("Enter the max # of guesses per game");
guessPermitted = guessScan.nextInt();
double winRatio = NumberGuessingGameSim(guessPermitted);
System.out.println("win ratio is " + winRatio+"%");
}
public static double NumberGuessingGameSim(int guessPermitted){
int currentRun = 0; //counter
while(currentRun<totalRun){
currentRun++;
PlayNumberGuessingGameSim(guessPermitted);
}
return ((double)totalWin*100/totalRun);
}
private static void PlayNumberGuessingGameSim(int guessPermitted){
int answer, guess, guessCount;
int lowerRange, upperRange;
answer = (int)(Math.random()*100) +1;
guessCount = 0;
lowerRange = 1;
upperRange = 100;
while (guessCount < guessPermitted){
guess = (upperRange - lowerRange)/2 + lowerRange;
if (guess == answer){
totalWin++;
break;
}
else if (guess < answer){
lowerRange = guess;
guessCount++;
}
else {
upperRange = guess;
guessCount++;
}
}
}
}
import java.util.*;
public final class MontyHallGameSim{
static int totalSwitchWin = 0;
static int totalKeepWin = 0;
public static void main(String[] args){
int totalPlay = 10000;
for(int iplay=0; iplay<totalPlay; iplay++){
playMontyHallGame();
}
System.out.println("Out of total of " + totalPlay + " games, stay(no-switch) strategy won " + totalKeepWin + " times and switch strategy won " + totalSwitchWin + " times.");
System.out.println("Win ratios are respectively " + String.format("%.2f",(double)(totalKeepWin*100/totalPlay)) + "% and " + String.format("%.2f",(double)(totalSwitchWin*100/totalPlay)) + "%.");
}
private static final void playMontyHallGame(){
Set<Integer> doorsSet = new HashSet<Integer>(); //declare and initialize the doors
doorsSet.add(1);
doorsSet.add(2);
doorsSet.add(3);
Set<Integer> emptyDoorsSet = new HashSet<Integer>();
emptyDoorsSet.addAll(doorsSet);
int prizeDoor = (int)(Math.random()*3 + 1); //generate U[1,3] for the prize door
emptyDoorsSet.remove(prizeDoor); //remove the prize door from the set
int initialChoice = (int)(Math.random()*3 + 1) ;//generate U[1,3] for the player's initial choice
emptyDoorsSet.remove(initialChoice); //preparing for openable door set
ArrayList<Integer> openableDoorList = new ArrayList<Integer>(emptyDoorsSet); //an openable door is one that is both empty and not chosen
int openableDoorShown = openableDoorList.get((int)(Math.random()*emptyDoorsSet.size())); //depending on whether initial choice is correct, the openable door set can have 1 (if incorrect) or 2 (if correct) elements
int finalKeepChoice = initialChoice;
int finalSwitchChoice;
doorsSet.remove(initialChoice); //identifying the sole remaining door to switch to, by removing the initially chosen and the shown doors
doorsSet.remove(openableDoorShown);
if (doorsSet.contains(1))
finalSwitchChoice = 1;
else if (doorsSet.contains(2))
finalSwitchChoice = 2;
else
finalSwitchChoice = 3;
if(finalKeepChoice==prizeDoor)
totalKeepWin++;
else if (finalSwitchChoice==prizeDoor)
totalSwitchWin++;
}
}