Created
December 15, 2021 18:10
-
-
Save havardge/f6b672ce11bebd1f0ca74fe76dc278b3 to your computer and use it in GitHub Desktop.
Simulering av julekalender
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Arrays; | |
import java.util.Random; | |
public class Main { | |
final static boolean DEBUG = false; | |
final static String DEBUG_FORMAT = "%10s | %8s | %18s | %20s%n"; | |
final static boolean VELG_TILFELDIG_TELLER_SOM_IKKE_ER_FORST = false; // juks | |
final static int ANTALL_PERSONER = 5; | |
final static int ANTALL_SIMULERINGER = 10000000; | |
final static int SEKVENS_LENGDE = 40; | |
final static boolean[] personHarByttetTeppe = new boolean[ANTALL_PERSONER]; | |
final static boolean[] teppe = new boolean[SEKVENS_LENGDE]; | |
final static Random random = new Random(); | |
public static void main(String[] args) { | |
if (DEBUG && ANTALL_SIMULERINGER > 10) { | |
System.out.println("Du ønsker trolig ikke å skrive ut så store mengder tekst"); | |
System.exit(0); | |
} | |
int strategi_1_seier = 0; | |
int strategi_1_seier_strategi_2_feilet = 0; | |
long strategi_1_kumulativ_teller = 0; | |
long strategi_1_kumulativ_nevner = 0; | |
int uavgjort = 0; | |
int strategi_2_seier = 0; | |
int strategi_2_seier_strategi_1_feilet = 0; | |
long strategi_2_kumulativ_teller = 0; | |
long strategi_2_kumulativ_nevner = 0; | |
int uavgjort_der_ingen_strategier_ga_loslatelse = 0; | |
for (int i = 0; i < ANTALL_SIMULERINGER; i++) { | |
// genererer tur-sekvens bestående av tallene [0, 4] dvs. de fem personene | |
int[] sekvens = random | |
.ints(SEKVENS_LENGDE, 0, ANTALL_PERSONER) | |
.toArray(); | |
// Velger den første i sekvensen som ansvarlig for telling | |
int strategi_1_antall_turer = beregnAntallTurer(sekvens, sekvens[0]); | |
// Velger en tilfeldig person som ansvarlig for telling | |
int strategi_2_antall_turer = beregnAntallTurer(sekvens, velgTilfeldigTeller(sekvens[0])); | |
if (strategi_1_antall_turer != Integer.MAX_VALUE) { | |
strategi_1_kumulativ_teller += strategi_1_antall_turer; | |
strategi_1_kumulativ_nevner += 1; | |
} | |
if (strategi_2_antall_turer != Integer.MAX_VALUE) { | |
strategi_2_kumulativ_teller += strategi_2_antall_turer; | |
strategi_2_kumulativ_nevner += 1; | |
} | |
if (strategi_1_antall_turer == strategi_2_antall_turer) { | |
uavgjort += 1; | |
} | |
if (strategi_1_antall_turer < strategi_2_antall_turer) { | |
strategi_1_seier += 1; | |
} | |
if (strategi_2_antall_turer < strategi_1_antall_turer) { | |
strategi_2_seier += 1; | |
} | |
if (strategi_1_antall_turer < Integer.MAX_VALUE && strategi_2_antall_turer == Integer.MAX_VALUE) { | |
strategi_1_seier_strategi_2_feilet += 1; | |
} | |
if (strategi_2_antall_turer < Integer.MAX_VALUE && strategi_1_antall_turer == Integer.MAX_VALUE) { | |
strategi_2_seier_strategi_1_feilet += 1; | |
} | |
if (strategi_1_antall_turer == Integer.MAX_VALUE && strategi_2_antall_turer == Integer.MAX_VALUE) { | |
uavgjort_der_ingen_strategier_ga_loslatelse += 1; | |
} | |
} | |
System.out.println("Antall seiere for strategi 1 (første person som går tur er telleren): " + strategi_1_seier); | |
System.out.println("Gjennomsnittlig turlengde for strategi 1 " + (double) strategi_1_kumulativ_teller / strategi_1_kumulativ_nevner); | |
System.out.println("Antall ganger strategi 1 vant og strategi 2 feilet " + strategi_1_seier_strategi_2_feilet); | |
System.out.println("Antall seiere for strategi 2 (tilfeldig forhåndsbestemt person): " + strategi_2_seier); | |
System.out.println("Gjennomsnittlig turlengde for strategi 2 " + (double) strategi_2_kumulativ_teller / strategi_2_kumulativ_nevner); | |
System.out.println("Antall ganger strategi 2 vant og strategi 1 feilet " + strategi_2_seier_strategi_1_feilet); | |
System.out.println("Uavgjort: " + uavgjort); | |
System.out.println("Antall uavgjorte der ingen av strategiene førte til frihet: " + uavgjort_der_ingen_strategier_ga_loslatelse); | |
} | |
static int beregnAntallTurer(int[] sekvens, int tellerId) { | |
Arrays.fill(personHarByttetTeppe, false); | |
Arrays.fill(teppe, false); | |
if (DEBUG) { | |
System.out.format(DEBUG_FORMAT, "Person", "Teppe", "Tellerens status", "Handling"); | |
} | |
int teller = 1; | |
for (int i = 0; i < sekvens.length; i++) { | |
// Teppet har med seg tilstand fra forrige tur | |
if (i > 0) { | |
teppe[i] = teppe[i - 1]; | |
} | |
boolean harTellerRolle = sekvens[i] == tellerId; | |
String handling = ""; | |
if (harTellerRolle && teppe[i]) { | |
teppe[i] = false; | |
teller += 1; | |
handling = "Teppet settes til blått av telleren"; | |
} | |
if (!harTellerRolle && !personHarByttetTeppe[sekvens[i]] && !teppe[i]) { | |
teppe[i] = true; | |
personHarByttetTeppe[sekvens[i]] = true; | |
handling = "Teppet settes til rødt av person " + sekvens[i]; | |
} | |
if (DEBUG) { | |
System.out.format(DEBUG_FORMAT, | |
harTellerRolle ? "(teller) " + sekvens[i] : sekvens[i], | |
teppe[i] ? "Rødt" : "Blått", | |
teller, | |
handling); | |
} | |
if (teller == ANTALL_PERSONER) { // Teller annonserer at alle har gått tur | |
return i + 1; | |
} | |
} | |
return Integer.MAX_VALUE; // Ingen frihet :( | |
} | |
static int velgTilfeldigTeller(int forst) { | |
if (! VELG_TILFELDIG_TELLER_SOM_IKKE_ER_FORST) { | |
return random.nextInt(ANTALL_PERSONER); | |
} | |
int result = forst; | |
while (result == forst) { | |
result = random.nextInt(ANTALL_PERSONER); | |
} | |
return result; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment