GK Explozive Skrevet 18. mars 2013 Del Skrevet 18. mars 2013 (endret) hei, jeg har en oppgave som går ut på å skrive et program som gir ut tilfeldig krone eller mynt. oppgaven min er å skrive ferdig "mynt" klassen. Det som skal gjøres er : • Konstruktøren som oppretter slumptallgeneratoren og setter feltet utfall til en tilfeldig verdi med metoden kast(). • Metoden kast() som kaster mynten ved hjelp av pseudo-slumptall generatoren. Her er det lurt å bruke metoden nextBoolean() i klassen Random som returnerer en tilfeldig boolsk verdi. • Metoden hentUtfall() som returnerer utfallet i Mynt-objektet. Bruk det vedlagte programmet MyntTest til å teste Mynt klassen. det jeg hra gjort så langt : import java.util.Random; public class Mynt{ /** Pseudo-slumptallgenerator */ private Random generator; /** Siden av mynten som er vendt opp. */ private MyntkastUtfall utfall; boolean KRON; boolean MYNT; public Mynt(){ //Konstruktør kron = true; } private boolean kron; public boolean kast(){ Random generator = new Random(); int utfallKron = generator.nextInt(100); kron = (utfallKron < 50); } public boolean hentUtfall(){ if ( kron = true) { return KRON; } else return MYNT; } } Dette er klassen som skal teste mynt klassen. public class MyntTest { public static final int ANTALL_KAST = 10000; public static void main(String[] args){ int antallMynt = 0; int antallKron = 0; //Simulerer myntkast Mynt mynt = new Mynt(); for (int i = 0; i < ANTALL_KAST; i++) { mynt.kast(); switch(mynt.hentUtfall()){ case MYNT: antallMynt++;break; case KRON: antallKron++;break; default: assert false; } } //Skriver statistikk System.out.printf("Andel Kron : %.3f%n", (double)antallKron / ANTALL_KAST); System.out.printf("Andel Mynt : %.3f%n", (double)antallMynt / ANTALL_KAST); } } dette er kompileringsfeilen, hva skal jeg gjøre for å fikse dette ? Error: incompatible types required: int found: boolean Endret 18. mars 2013 av Explozive Lenke til kommentar
Persn Skrevet 18. mars 2013 Del Skrevet 18. mars 2013 Switch-case bruker int-verdier og du setter inn en boolean, bruk if-else setninger istedet Lenke til kommentar
GK Explozive Skrevet 18. mars 2013 Forfatter Del Skrevet 18. mars 2013 Switch-case bruker int-verdier og du setter inn en boolean, bruk if-else setninger istedet meningen er å la MyntTest klassen være som den er. det er Mynt klassen som må fikses .... Jeg skjønner at det er surr med boolean og int, men jeg vet ikke hvordan jeg fikser dette Lenke til kommentar
Persn Skrevet 18. mars 2013 Del Skrevet 18. mars 2013 Skriv om metoden hentUtfall til å returnere en int, 0 eller 1 da, da må konstantene KRON og MYNT skrives om til int også med hver sin 1 og 0 verdi. Lenke til kommentar
GK Explozive Skrevet 18. mars 2013 Forfatter Del Skrevet 18. mars 2013 nå har jeg dette: import java.util.Random; public class Mynt{ /** Pseudo-slumptallgenerator */ private Random generator; /** Siden av mynten som er vendt opp. */ private MyntkastUtfall utfall; //SKRIV FERDIG DENNE KLASSEN public static final int KRON = 1; public static final int MYNT = 0; public Mynt(){ //Konstruktør kron = true; } private boolean kron; public boolean kast(){ Random generator = new Random(); int utfallKron = generator.nextInt(100); kron = (utfallKron < 50); return kron; } public int hentUtfall(){ if ( kron = true) { return KRON; } else return MYNT; } } men kompilatoren kommer med : Error: cannot find symbol symbol: variable MYNT location: class MyntTest på MyntTest klassen. jeg blir helt forvirret jeg ... forresten kan noen komme med forslag til bruk av nextBoolean og hvordan jeg kan bruke det her istedenfor nextInt ? Lenke til kommentar
GeirGrusom Skrevet 19. mars 2013 Del Skrevet 19. mars 2013 MYNT er ikke implisitt tilgjengelig i MyntTest. I klassen MyntTest må du eksplisitt be om Mynt.MYNT da MYNT er definert i klassen Mynt, ikke MyntTest. nextBoolean() ville vært en funksjon som returnerer true eller false og kan skrives slik: private boolean nextBoolean() { return random.nextInt(1) == 1; // Trekk et tilfeldig tall mellom null og én, og dersom tallet er 1, returner true. } Vet ikke om samme er tilfelle i Java, men i .NET ihvertfall er det ikke noen god idé å opprette en Random instans hver gang du skal bruke den. Ved siden av at man får en del unødvendig GC thrashing, så blir ikke tallene spesielt unike ettersom seeden resetter seg til systemtid hver gang funksjonen brukes, og har en oppløsning nær det "veggklokka" på systemet, noe som ligger på mer enn 15 millisekunder mellom hver nye "tilfeldige" seed. Dette ser normalt ikke veldig bra ut. Lenke til kommentar
Persn Skrevet 19. mars 2013 Del Skrevet 19. mars 2013 Man kan også bare bruke Randoms innebygde nextBoolean boolean utfall = generator.nextBoolean(); Litt usikker på hvordan man skal håndtere problemet med switch-casene hvis det er meningen at man ikke skal skrive om i MyntTest, men den mest funksjonelle løsningen jeg ser for meg er den GeirGrusom skrev. Lenke til kommentar
Pydien Skrevet 20. mars 2013 Del Skrevet 20. mars 2013 (endret) import java.util.Random; public class Mynt{ /** Pseudo-slumptallgenerator */ private Random generator; //SKRIV FERDIG DENNE KLASSEN public static final int KRON = 0; public static final int MYNT = 0; public Mynt(){ //Konstruktør } private boolean utfall; public boolean kast(){ generator = new Random(); utfall = generator.nextBoolean(); if(utfall) KRON = 1; else MYNT = 1; } public int hentUtfall(){ if ( KRON = 1) { return KRON; } else return MYNT; } } Endret 20. mars 2013 av Pydien Lenke til kommentar
ti-guru Skrevet 26. mars 2013 Del Skrevet 26. mars 2013 (endret) import java.util.Random; public class Mynt{ /** Pseudo-slumptallgenerator */ private Random generator; //SKRIV FERDIG DENNE KLASSEN [b]public static final int KRON = 0;[/b] [b]public static final int MYNT = 0;[/b] public Mynt(){ //Konstruktør } private boolean utfall; public boolean kast(){ generator = new Random(); utfall = generator.nextBoolean(); if(utfall) KRON = 1; else MYNT = 1; } public int hentUtfall(){ if ( KRON = 1) { return KRON; } else return MYNT; } } Må løfte pekefingeren her: "Item 30: Use enums instad of int constants" i Effective Java av Joshua Bloch forklarer ganske greit hvorfor man skal holde seg langt unna int-konstanter. Bruk enum i stedet. Forøvrig virker ikke koden over. public class Mynt { ... public enum Utfall { MYNT, KRON; } ... } Her er eksempelet han bruker i boken: public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; Kompilatoren klager ikke dersom et eple brukes som parameter i en metode som egentlig skal bruke appelsiner, og vice versa. Videre gir det heller ikke mening at du kan bruke == operatoren og sammenligne epler og appelsiner. Til slutt, så gir det heller ikke mening at man kan gjøre følgende: int i = (APPLE_FUJI - ORANGE_TEMPLE) / APPLE_PIPPIN; Ellers ville jeg flyttet initialiseringen av prg'en til konstruktøren slik: public class Mynt { private Random generator; public Mynt() { this.generator = new Random(System.currentTimeMillis()); } ... } Endret 26. mars 2013 av ti-guru 1 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå