Gå til innhold

[Løst] Kast terning program


Anbefalte innlegg

Heisann! :)

 

Jeg holder på å lære meg java-programmering, har ikke holdt på å veldig lenge.

 

Jeg kom over et eksempel på et program som kaster terningen, der man skrive inn hvor mange kast man vil ha, og får deretter en statistikk på hvor mange enere, toere osv man har fått opp. Men jeg skjønte ikke alt i denne koden, er det noen som kan forklare meg hva disse for loopene her gjør?

 

 

import java.util.Random;
import java.util.Scanner;
public class kast {
public static void main(String[] args){

 Random rand = new Random();
 int terning[] = new int[7];
 int rull;
 int antall;
 int tall;

 Scanner antallkast = new Scanner(System.in);
 System.out.println("Hvor mange kast vil du ha?");
 antall = antallkast.nextInt();


 for(rull=0;rull<antall;rull++){
  ++terning[1+rand.nextInt(6)];

 }
 System.out.println("Tall\tAntall");

 for(tall=1;tall<terning.length;tall++){
  System.out.println(tall+"\t"+terning[tall]);
 }
}
}

 

Hva gjør denne:

++terning[1+rand.nextInt(6)]; 

og hvorfor er tall<terning.length, og hva er terning.length?

tall<terning.length

 

Svært takknemmelig for all hjelp! :)

Lenke til kommentar
Videoannonse
Annonse

Begge spørsmålene dine referer til denne kodebiten

int terning[] = new int[7];

 

Dette er en tabell med lengde 7 som skal lagre terningkastene, egentlig hadde det holdt med en på lengde 6 men det er nå så.

 

Hva gjør denne:

++terning[1+rand.nextInt(6)]; 

 

++ Foran variabelen betyr at verdien til den variabelen økes med 1, siden det er en tabell så må det også spesifiseres hvor den skal lages så [kode] angir hvor i tabellen det skal økes med et heltall, 1 + sørger for at det blir brukt verdiene 1, 2, 3, 4, 5 og 6 akkurat som på en terning, rand.nextInt(6) sørger for at det blir trekt et tilfeldig heltall fra 1 til 6.

 

og hvorfor er tall<terning.length, og hva er terning.length?

 

Den siste løkka blir brukt til å skrive ut alle terningsidene og hvor mange kast denne siden har oppnådd, derfor tall<terning.length, den gjør at løkka da kjører 6 ganger noe som er logisk. Da er det viktig å vite at terning.length gir ut LENGDA på tabellen terning, merk at i starten av koden så blir lengden satt til 7, 0 er også en index-verdi i tabellen.

Lenke til kommentar

Begge spørsmålene dine referer til denne kodebiten

int terning[] = new int[7];

 

Dette er en tabell med lengde 7 som skal lagre terningkastene, egentlig hadde det holdt med en på lengde 6 men det er nå så.

 

 

 

++ Foran variabelen betyr at verdien til den variabelen økes med 1, siden det er en tabell så må det også spesifiseres hvor den skal lages så [kode] angir hvor i tabellen det skal økes med et heltall, 1 + sørger for at det blir brukt verdiene 1, 2, 3, 4, 5 og 6 akkurat som på en terning, rand.nextInt(6) sørger for at det blir trekt et tilfeldig heltall fra 1 til 6.

 

 

 

Den siste løkka blir brukt til å skrive ut alle terningsidene og hvor mange kast denne siden har oppnådd, derfor tall<terning.length, den gjør at løkka da kjører 6 ganger noe som er logisk. Da er det viktig å vite at terning.length gir ut LENGDA på tabellen terning, merk at i starten av koden så blir lengden satt til 7, 0 er også en index-verdi i tabellen.

 

Takk for en god forklaring! Men betyr det at jeg kan skrive tall<7 istedenfor tall<terning.length? Går ikke det for det samme? :hmm:

Lenke til kommentar

Takk for en god forklaring! Men betyr det at jeg kan skrive tall<7 istedenfor tall<terning.length? Går ikke det for det samme? :hmm:

 

Ja, og nei. Det ville gått bra i dette tilfellet siden en terning alltid har 6 sider (med mindre du begynner å blande inn D20 fra Dungens and Dragons og lignende), men i tilfeller hvor opererer med dynamiske lengde, noe vi gjerne gjør i et mer reelt kodetilfelle, så kan vi ikke hardkode verdier ved å skrive tallet direkte.

Altså, hvis tabellen endrer størrelse så skal du slippe å måtte gå inn i koden og skifte, dette er også uansett litt vanskelig å gjøre mens programmet kjører.

 

Det er også uansett god konvensjon å alltid gjøre det, det skal gå an for andre folk som leser koden å se med en gang at løkka har en plan istedenfor at det er tallverdier som for alt de vet, kan du ha trekt ut i fra ræva. Dette er spesielt viktig i din kode sitt tilfelle siden det ikke er logisk at tabellstørrelsen er på 7 når en terning har 6 sider.

Lenke til kommentar

Helt greit å bruke en array med plass til 7 elementer her, men det hadde vært en fordel å kommentere det der array'en opprettes, noe ala dette:

 

 // bruker indeks 1-6 for terningen, indeks 0 brukes ikke
 int terning[] = new int[7];

Lenke til kommentar
  • 3 uker senere...

Jeg har skjønt det meste av dette nå! Takk for gode og forståelige svar!

 

Men jeg har prøvd å jobbe videre med denne, der jeg prøver å regne ut gjennomsnittet av kastene.

Det jeg sliter med er å lage en variabel som regner ut summen av alle kastene. Altså hvis kast nr 1 blir 3, og kast nr 2 blir 6, så er summen 9.

 

Er det noen som kan gi meg et lite hint om hvordan jeg lager denne variabelen? Finner bare ut hvordan jeg regner ut summen av arrayen frekvens, men det hjelper meg i grunn ikke så mye.

 

 

Edit:

 

Jeg har kommet så langt:

 

Random rand = new Random();
int frekvens[] = new int[7];
int rull;
int tallt;
int antallt;

Scanner trill = new Scanner(System.in);

System.out.println("Hvor mange kast vil du ha?");
antallt = trill.nextInt();

for(rull = 0;rull<antallt;rull++) {
 ++frekvens[1+rand.nextInt(6)];
}

System.out.println("Tall\tAntall");

for(tallt = 1;tallt<frekvens.length;tallt++){
 System.out.println(tallt+"\t"+frekvens[tallt]);
}

  //Regner ut siden av terningen multiplisert med antall ganger terningen lander på denen siden
  int summ1 = 1*frekvens[1];
  int summ2 = 2*frekvens[2];
  int summ3 = 3*frekvens[3];
  int summ4 = 4*frekvens[4];
  int summ5 = 5*frekvens[5];
  int summ6 = 6*frekvens[6];
  int total = summ1+summ2+summ3+summ4+summ5+summ6;
					System.out.println("Sum\t"+total);
					int gjennomsnittkast = total/antallt;
					System.out.println("Gjennomsnitt\t"+gjennomsnittkast);
  }

 

Dette virket, men såvidt jeg har forstått blir det kalt for hardkoding når jeg regner ut summen på hver enkelt side av terningen "manuelt", istedenfor at en variabel gjør den jobben.

Endret av BloodySquito
Lenke til kommentar

Du kan jo gjøre summeringen på samme måte som du gjør utskriften av frekvensene ovenfor, noe slikt:

 

int sum = 0;
for (int i = 1; i < frekvens.length; i++) {
 sum += i * frekvens[i];
}
System.out.println("Sum\t" + sum);
System.out.println("Gjennomsnitt\t" + (sum / antallt));

 

Og da kan jo denne kombineres med løkka ovenfor, slik:

 

int sum = 0;
for (tallt = 1; tallt < frekvens.length; tallt++) {
 System.out.println(tallt + "\t" + frekvens[tallt]);
 sum += tallt * frekvens[tallt];
}

 

Koden er ikke testet...

Endret av jonny
Lenke til kommentar

Du kan jo gjøre summeringen på samme måte som du gjør utskriften av frekvensene ovenfor, noe slikt:

 

int sum = 0;
for (int i = 1; i < frekvens.length; i++) {
 sum += i * frekvens[i];
}
System.out.println("Sum\t" + sum);
System.out.println("Gjennomsnitt\t" + (sum / antallt));

 

Og da kan jo denne kombineres med løkka ovenfor, slik:

 

int sum = 0;
for (tallt = 1; tallt < frekvens.length; tallt++) {
 System.out.println(tallt + "\t" + frekvens[tallt]);
 sum += tallt * frekvens[tallt];
}

 

Koden er ikke testet...

 

 

Takk! Det funket! :)

Jeg hadde faktisk gjort akkurat det samme selv isted før jeg gav opp og brukte "hardkoding"-metoden..eneste jeg gjorde feil var at jeg brukte frekvens[tallt] istedenfor frekvens..blir mye slurvefeil med mange variabler merker jeg :)

 

Men en liten ting jeg lurer på, hvorfor "+=" og ikke "=" ?

Endret av BloodySquito
Lenke til kommentar

"sum += xxx" er det samme som "sum = sum + xxx". Du slipper å skrive navnet på variabelen to ganger :-)

 

Hvis du hadde brukt = istedenfor (og ikke tatt med sum på høyre side av likhetstegnet), ville sum inneholdt verdien "6 * frekvens[6]" når løkka er ferdig... det er også veldig viktig å sette sum til 0 før løkka starter.

Endret av jonny
Lenke til kommentar

Takk! Det funket! :)

Jeg hadde faktisk gjort akkurat det samme selv isted før jeg gav opp og brukte "hardkoding"-metoden..eneste jeg gjorde feil var at jeg brukte frekvens[tallt] istedenfor frekvens..blir mye slurvefeil med mange variabler merker jeg :)

...

 

Det er "god skikk" å la variablene ha minst mulig "scope", enkelt sagt vil det si at de bør deklareres nærmest mulig der de brukes. Jeg ville skrevet koden slik:

 

 final int TERNING_KANTER = 6;

 Random rand = new Random();
 int frekvens[] = new int[TERNING_KANTER];
 int antallKast;
 int sum = 0;
 Scanner trill = new Scanner(System.in);

 System.out.println("Hvor mange kast vil du ha?");
 antallKast = trill.nextInt();
 for (int i = 0; i < antallKast; i++) {
   int terning = rand.nextInt(TERNING_KANTER);
++frekvens[terning];
   sum += terning + 1;
 }

 System.out.println("Tall\tAntall");
 for (int i = 0; i < TERNING_KANTER; i++) {
System.out.println((i+1) + "\t" + frekvens[i]);
 }
 System.out.println("Sum\t" + sum);
 System.out.println("Gjennomsnitt\t" + (sum / antallKast));
}

Endret av jonny
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...