Post by Dennis ReinertEs stellt etwas ähnliches wie ein Lotto System dar.
Mit Random wäre ich in der Lage Zufallszahlen aus einem Pool von 49 Zahlen
zu erstellen. Nun will ich, dass ein Benutzer aus dem Pool von 60 Zahlen
zufällig generierte Folgen von jeweils 6 Zahlen erstellen kann.
Dabei soll er zusätzlich in die Lage versetzt werden, aus diesem Pool nur
beliebige Zahlen für die Generierung der 6er Reihe zu erstellen. Allerdings
soll er dabei minimum 10 Zahlen angeben (OK, dass ist simpel lösbar).
Also ich vergaß zu erwähnen
Menge: N von 1 bis 60
Zufallszahlen immer 6 Stück aus der Menge N
Begrenzen wir mal die Anzahl der möglichen 6er Kombis auf eine
festeinstellbare Menge von
maximal 20 Kombinationen.
Ah, nun wird es klarer. Fragen stellen scheint teilweise nicht so einfach.
Das /alle/ Kombinationen aus deinen bisherigen Aussagen ist der Ansatz:
Erst mal alles sammeln, dann seh'n wie weiter. Das sowas recht lange
dauern kann sieht man gut.
Zum Problem:
Ist doch ganz einfach, du hast eine Liste S von n Elementen und willst
daraus m zufällige Teilreihen R mit je k Elementen erstellen. Die
Reihenfolge der Elemente in R ist dabei zu vernachlässigen -
Permutationen sind also als gleich anzusehen.
(Das S nur ein Teil aus der Gesamtliste ist ist unerheblich)
Nette kleine Aufgabe zur Entspannung. Diese Lösung ist nicht
superschnell, aber recht kompakt.
---------------------------------------------------------------
import java.util.*;
public class LottoAlike {
public static void main(String[] args) {
List all = new ArrayList();// input bauen
for(char c='a';c<='z'; c++) all.add( String.valueOf(c));
Collections.shuffle(all); // mischen
List selection = all.subList(0,10);// Die Auswahl
Set rows = new LottoAlike().makeRows(selection, 5, 6);
System.out.println(rows);
}
/*
* numRows kombinationen (länge rowSize) aus list erstellen
*/
Set makeRows(List list, int numRows, int rowSize) {
list = new ArrayList(list); // copy wegen shuffle, s.u.
Set rows = new HashSet(); // gewürfelte reihen, Set: gleiche nur 1x
/*
* hier kann man durchaus in eine Endlosschleife kommen,
* wenn alle Kombis da sind oder immer diesselbe kommt.
* Da muß man viel schlauer werden, oder einfach nach
* 10*NUM_ROWS eine Exception werfen
*/
while(rows.size()<numRows){
// zufällige teilmenge mit rowSize elementen, ergebnis ist sortiert
Collections.shuffle(list); // würfeln
List candidate = new ArrayList(list.subList(0,rowSize)); // lies
subList doku
Collections.sort(candidate);// permutationen erkennen
rows.add(candidate); // dupes werden erkannt
}
return rows;
}
}
---------------------------------------------------------------
Grüße
Peter
--
Shell&Jar : Individual icons for jars
jMineSweeper : extended
www.PeterBuettner.de