Skip to content

Instantly share code, notes, and snippets.

@havardge
Created December 15, 2021 18:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save havardge/f6b672ce11bebd1f0ca74fe76dc278b3 to your computer and use it in GitHub Desktop.
Save havardge/f6b672ce11bebd1f0ca74fe76dc278b3 to your computer and use it in GitHub Desktop.
Simulering av julekalender
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