# Lotto 6 aus 49



## Lybrial (24. Nov 2010)

Hallo, 

wie der Name schon sagt möchte ich 6 Zufallszahlen generieren.
Vorgabe ist, das 49 Zahlen in einem Array gespeichert werden sollen.
Dann soll zufällig eine der 49 Zahlen ausgewählt werden und der Index
des Arrays an dieser Stelle auf "False" gesetzt werden.

Hintergrund dafür ist, das wenn die nächste zufällig generierte Zahl, die
selbe sein sollte wie die vorangegangene soll er einfach checken ob der
Array-Index an dieser Stelle True oder False ist, wenn True, kann er die
Zahl nehmen, wenn False soll er eine Stelle nach "rechts" gehen und die 
dortige Zahl ausgeben und auf False setzen.

Ich habe leider keine Ahnung wie man so etwas machen kann....

Da hat bestimmt wer ne Idee


----------



## Michael... (24. Nov 2010)

Du kannst bei einem int Array keine Stelle auf false setzen, höchstens auf -1 oder sonst einen ungültigen Wert.
Eventuell sollst Du aber auch nur ein boolean Array verwenden und die Indizes stehen dann für die Lottozahlen.


----------



## AmunRa (24. Nov 2010)

```
boolean[] b= new boolean[49];

for (int i=0;i<49;i++){
b[i]=true;
}

Random r= new Random();

int[] n=new int[6];

for (int i=0;i<6;i++){

int rand= r.nextInt(49);

while(b[rand]==false){
rand++;
if (rand>=49){
rand=0;
}
}
n[i]=rand+1;
}

//nun sind in n die Zahlen die du gezogen hast
```

kann sein das noch ein kleiner Fehler drin is habs nicht kompiliert


----------



## Andi_CH (24. Nov 2010)

EDIT: AmunRa: Damit hast du dem TO aber nicht wirklich weitergeholfen :-( es ist zum ko.....


Natürlich kannst du einen boolean[48] array machen - ist sogar sehr effizient
Aber du solltest wohl die 6 gezogenen Zahlen am Schluss auch noch haben, also brauchst du noch einen int[5] array. Den boolean array könntest du dir auch sparen und den Array der schon gezogenen Zahlen durchsuchen.

Wie generierst man eine Zufallszahl?
Math.random liefert einen zufälligen double Wert zwischen 0 und 1 
(gibt es sicher schon in einigen anderen Threads)

ein bisschen Rechnen und du kommst auf Werte zwischen 1 und 49 
(gibt es sicher schon in einigen anderen Threads)

prüfen ob Zahl schon früher gezogen wurde
falls nein:  boolean setzen und Zahl eintragen
falls ja:     so lange neue Zahl ziehen, bis einen neue gefunden wurde

das ganz so lange wiederholen bis 6 Zahlen gefunden wurden.

Wow, bin ich heute gutmütig, sonst hätte ich nur (gibt es sicher schon in einigen anderen Threads)" geschrieben!


----------



## AmunRa (24. Nov 2010)

@ Andi_CH 

du brauchst nicht die anderen User beleidigen das gehört sich auch nicht,

weiters müssten seine arrays boolean[49] und int[6] sein und nicht wie du geschreiben hast boolean[48] und int[5];


----------



## Lybrial (24. Nov 2010)

Ich danke für die Hilfe 

Eigentlich wars recht trivial, drauf zu kommen ist die Schwierigkeit...

Zu AmunRas Code:
Nachdem eine Variable erzeugt wurde muss das Array an der betreffenden
Stelle, wenn ich das richtige sehe, noch auf "false" gesetzt werden.

```
boolean[] b= new boolean[49];
 
for (int i=0;i<49;i++){
b[i]=true;
}
 
Random r= new Random();
 
int[] n=new int[6];
 
for (int i=0;i<6;i++){
 
    int rand= r.nextInt(49);
 
    while(b[rand]==false){
        rand++;
        if (rand>=49){
            rand=0;
        }
    }
    n[i] = rand+1;
    b[rnd] = false;     //genau hier ;)
}
```


----------



## xerberuz (24. Nov 2010)

Wenn man eine Zahl schon hat und dann einfach die nächste nimmt macht man damit nicht die Wahrscheinlichkeit kaputt? Wenn man 30 schon hat dann ist 31 doch wahrscheinlicher als die anderen Zahlen.


----------



## Lybrial (24. Nov 2010)

Das Problem ist, wir sollen das erweitern können, das wir z.B. auch
50.000.000 aus 60.000.000 berrechnen können, mit annehmbarer Rechenzeit.

Würden wir einen Random-Zahl erzeugen, und dann prüfen ob diese schon 
erzeugt wurde und dann solange Zahlen erstellen lassen, bis die passende
Zahl kommt, rechnet der PC bis zum St.Nimmerleinstag


----------



## xerberuz (24. Nov 2010)

eine Alternativlösung wäre z.B.:


```
public static void main(final String[] args) throws InterruptedException
   {
      final List<Integer> numbers = new ArrayList<Integer>();
      for (int i = 1; i <= 49; i++)
      {
         numbers.add(i);
      }
      Collections.shuffle(numbers);
      System.out.println(Arrays.deepToString(numbers.subList(0, 6).toArray()));
   }
```


----------



## Andi_CH (24. Nov 2010)

AmunRa hat gesagt.:


> @ Andi_CH
> du brauchst nicht die anderen User beleidigen das gehört sich auch nicht,



Ach nettes Detail ob 49 oder 0..48 so einen Tippfehler findet ja wohl jeder selbst.

Wenn du dich beleidigt fühlst, wenn man dich auf einen Fehler aufmerksam macht - na ja. Ich bleibe dabei dass es ein Fehler ist hier im Anfängerforum einfach so die Lösung hinzuknallen.

Dazu eine Anmerkung: Um die Lösung in Code zu schreiben hätte ich wesentlich weniger lang gebraucht, als um die Beschreibung zu erstellen - dem Fragesteller auf Anfängerniveau wird viel mehr geholfen, wenn man ihn auf den richtigen Weg bringt und dafür bin ich bereit Zeit zu investieren. Dass ich dann gefrustet bin wenn einer ..... aber vemtulich wirst du das nicht verstehen.

(Hättest ja auch einen Link auf die x schon exisierenden Lösungen für das selbe Problem einfügen können)

no further comments!


----------



## Lybrial (24. Nov 2010)

Eine gute, qualifizierte Hilfe schön und gut, 
dennoch sollte man sich zivilisiert verhalten....


----------



## Marco13 (24. Nov 2010)

Lybrial hat gesagt.:


> rechnet der PC bis zum St.Nimmerleinstag



Genau wie bei einer Ziehung "7 aus 6". OK, das kann man vorher abfangen. Aber viel kritischer ist IMHO, dass da tatsächlich der Zufall kaputt geht. Eine geshuffelte List ist wirklich das einfachste, aber Landeis Lösung aus http://www.java-forum.org/java-basi...re-int-variablen-miteinander-vergleichen.html ist auch nicht viel komplizierter, dafür aber "richtig".


----------

