Gå til innhold

Kontrollere at ingen elementer i en array er like?


Anbefalte innlegg

For eksempel en lotto-trekknign... Får ikke dette til å funke. Er jo en rimelig enkel oppgave, men jeg får det bare ikke til. Poenget her er at den ført gir en verdi til rekka[0] (før løkka starter) gir så en verdi til rekka[1], og sjekker om den er lik rekka[0]. (Det første programmet gjør er å gi alle elementene i arrayen verdien 0.)

 

 

 for (i=1; i<7; i++) {
 	rekka[i] = (int) (33 * Math.random())+1;
 	for (j=0; j<7; j++) {
   if (rekka[i] == rekka[j] && rekka[j] > 0) {
   	rekka[i] = (int) (33 * Math.random())+1;
   }
 	}
 }

Lenke til kommentar
Videoannonse
Annonse

Er dessverre noget på druen akkurat nå, men mener å huske at du først må opprette et objekt av Math.random(long seed), og så kalle objektets .nextInt i ditt tilfelle for å oppnå ønsket effekt.

 

Du finner nærmere informasjon her...

 

Kort sagt er poenget at du trenger å opprette et random objekt, og så kallet dets .nextInt() funksjon, så skulle alt fungere som du forventer.

Lenke til kommentar

Etter å ha tatt en litt nærmere titt, så ser jeg ikke noen feil i sammenligningskoden, men som jeg påpekte tidligere, du genererer samme tallet slike du gjør det nå.

Denne kodesnutten genererer forskjellige tall (dog noen like grunnet for lite mellomrom mellom hvert kall til nextInt()), og sjekker om de er like. Hvis ja, så genereres et nytt tall.

 

int rekka[] = new int[7];
       Random tilfeldig = new Random();
       for (int i=1; i<7; i++) {
           rekka[i] =  tilfeldig.nextInt();
           for (int j=0; j<7; j++) {
               if (rekka[i] == rekka[j] && rekka[j] > 0) {
                   System.out.println("Ja, var likt for " + i + "og verdien er: " + rekka[i]);
                   rekka[i] = tilfeldig.nextInt();
                   
               }
           }
       }

 

Men jeg ville nok heller anbefale deg å splitte ut random genereringen til en egen metode, og lage en egen metode til å sjekke at det ikke er noen like tall. For slik det er nå, så kan det godt hende at du ender opp med to like tall (siden det ikke er en sjekk på det nye tallet som genereres).

Lenke til kommentar

Det jeg pleier å gjøre er som Garibaldi: splitte ut tall-utvelgelsen i en egen klasse:

(Koden er bare tatt fra hodet og ikke testet)

 

public class RandomNumber
{
  private ArrayList numbers;

  public RandomNumber(int min, int max)
  {
     numbers = new ArrayList(max - min + 1);
     for (int i = min; i <= max; i++)
     {
        numbers.add(new Integer(i));
     }
  }

  public int getNextRandomNumber()
  {
    if (numbers.size() == 0) return -1; // eller noe annet her
    int index = (int) ((numbers.size() - 1) * Math.random() + 1;
    int number = ((Integer)numbers.get(index)).intValue();
    numbers.remove(index);
    return number;
  }
}
...
  
  RandomNumber rnd = new RandomNumber(1, 34);
  for (int i = 0; i < 7; i++)
  {
     System.out.println(rnd.getNextRandomNumber());
  }

 

Øyvind

Lenke til kommentar

Ok. takker for svar. Jeg tror jeg har misforstått dette med programering... Det jeg trodde koden min gjorde var å trekke et tilfeldig tall. Så trekker programmet et nytt tilfeldig tall, og sjekker om det er likt det første. Om det er likt, trekker det et nytt igjen...

 

Men men. Med denne "nextInt()" 'en, så trengs vel ikke det...

Lenke til kommentar

Tror koden din kan fungere, med et par endringer.

int i, j;
rekka[0] = (int) (33 * Math.random())+1;
//start:
for (i=1; i<7; i++) {
 rekka[i] = (int) (33 * Math.random())+1;
 for (j=0; j<7; j++) {
  if(i != j){
    if (rekka[i] == rekka[j] && rekka[j] > 0) {
      rekka[i] = (int) (33 * Math.random())+1;
//       goto start;
    }
  }
 }
}

Eneste endringen er at den sjekker at i ikke er lik j, da du ellers alltid vil ende opp med å generere nye tall når i == 0.

Den vil fortsatt kunne gi deg flere like tall, siden du bare sjekker en gang om det finnes like tall i listen... Så jeg vil fortsatt råde deg til å splitte ut genereringen og sjekkingen.

 

Bare endre metoden hvor du setter alle feltene til 0 til å generere tall i stedet, og sjekk så etterpå. Da kan du bruke den utkommenterte goto'en, eller finne en annen løsning, uten problemer.

 

Du kan lese hvordan nextInt() fungerer her. Men du må passe på at du ikke kaller metoden for raskt, da den da vil generere like tall. (Det gjelder alle slike random generatorer)

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...