[Java] Array vraagje

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • Toewan
  • Registratie: Oktober 1999
  • Laatst online: 29-07 19:17
Heb een vraagje, waarschijnlijk vrij eenvoudig, maar het blijkt maar weer dat mijn Java-kennis niet echt optimaal is. (heb ook uitgebreid de search bekeken, maar de oplossingen die daar geboden werden waren niet op mij van toepassing.)

Ik heb een array waarin ik 16 random getallen tussen 1 en 16 zet. Dat lukt, alleen het probleem is dat er getallen zijn die vaker voorkomen (wat ik niet wil hebben).
code:
1
2
3
4
5
6
7
    public int randomGetal()
    {
      r1 = Math.random();
      r1 = 16 * r1 + 1;
      int getal = (int) r1;
      return getal;
    }

Hierboven de methode voor random-getallen en deze worden in het array gezet door op de knop te drukken. :) Door middel van een paint methode worden ze op het scherm getoond
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public boolean action ( Event e, Object o)
    {
      if ( e.target == knop )
      {
        for(int i = 0; i< 16; i++)
        {
            getal = randomGetal();

            for (int a = 0; a < getallenReeks.length; a++)
            {
              if (getal == getallenReeks[a])
              {
                return false;               
              }
            }
            getallenReeks[i]=getal;
            repaint();
        }
      }   
      return false;
    }
}

Hierin maak ik dus ook een vergelijking of het getal al in het array getallenReeks[] voor komt. Door die return false komen er geen dubbele getallen in te staan, maar... het array is ook niet volledig gevuld, omdat ie bij constatering van een dubbel getal eruit springt. Oftewel, hoe krijg ik het array dan nog verder gevuld met de andere nog niet voorkomende getallen.
Of is er een eenvoudigere manier om dit op te lossen ??

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Je zou een 'Set'classe kunnen gebruiken. Die zijn erop ontworpen om geen dubbele items te bevatten. Ik zoek even voor je

Set interface: http://java.sun.com/j2se/1.4/docs/api/java/util/Set.html
HashSet class:
http://java.sun.com/j2se/1.4/docs/api/java/util/HashSet.html

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Als je alleen maar een array van ints tussen een bepaalde waarde gebruikt zou je ook twee arrays kunnen maken: eentje met de reeks en de andere met een hele hoop beshikbare random getallen. Wanneer de random-getal-generator dan een getal uitkiest hoef je die alleen maar uit de eerste array te halen (en eerst te controleren of ie daar wel in staat) en die in de tweede te zetten. Dan heb je nooit dubbelen :0 Maar dit is een beetje onwerkbaar als je met floats ofzo aan het werk bent. In dat geval zou je een soort array kunnen maken waarin alle nummers al staan die je hebt gegenereerd. Mocht er dan zo'n getal voor de tweede keer worden gegenereerd dan staat ie al in die lijst en kan het programma een nieuwe maken :) Veel succes ;)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:44
Op vrijdag 17 mei 2002 16:38 schreef Toewan het volgende:
Door die return false komen er geen dubbele getallen in te staan, maar... het array is ook niet volledig gevuld, omdat ie bij constatering van een dubbel getal eruit springt.
Dat moet je dan ook maar niet doen, he. :)

Er zijn al meerdere draadjes over dit onderwerp langsgekomen. De meest geschikte is naar mijn mening deze:

[topic=444400/1/25]

Hierin presenteert Dash2in1 een algoritme zoals jij dat je nu voorstelt en RickN en ik komen met een alternatief (de Ultieme Oplossing). Beide zijn in principe mogelijk; de prestaties worden ook geanalyseerd en de conclusie is dat er weinig schokkends gebeurt in 'gemiddelde' gevallen.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
boolean alreadyExists = false;
for (int a = 0; a < getallenReeks.length; a++) {            
  if (getal == getallenReeks[a])
  {
    alreadyExists = true;
    i--;
    break;     
  }
}
if (!alreadyExists) 
   getallenReeks[i]=getal;

Of een hashmap met als key de waarde.

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 01:06
Wat je ook kunt doen, en wat waarschijnlijk sneller werkt als je met grotere arrays gaat werken :

* Vul je array met getallen 1 t/m n.
* Zij x een random integer mod n.
* Zij y een random integer mod n.
* Verwissel het getal op plek x en y.
* Herhaal de laatste 3 stappen totdat de array voldoende random is.

  • Toewan
  • Registratie: Oktober 1999
  • Laatst online: 29-07 19:17
Dank voor jullie bijdragen, ik zal het eens gaan proberen met de oplossingen.
Pagina: 1