Gå til innhold

Anbefalte innlegg

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 av Explozive
Lenke til kommentar
Videoannonse
Annonse

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

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

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
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 av Pydien
Lenke til kommentar

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 av ti-guru
  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...