Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
habe ein Programm erstellt um Zufallszahlen zu erstellen.
Mit dem Scanner gebe ich an wieviele generiert werden sollen.
Das funkioniert auch soweit ganz alles.
Stehe nun vor folgenden 2 herrausforderungen die ich gern löse möchte:
1. Keine doppelten Zaheln
2. Wie kann ich einen Zahelnbereich begrenzen. also z.B. zaheln nur von 0-10 oder 5-12. das müsste doch iwie bei Math.random passieren oder?
Java:
public static void main(String[] args) {
Scanner Tastatur = new Scanner (System.in);
int n; //Anzahl der Werte
System.out.print("Anzahl der Zufallszahlen = ");
n = Tastatur.nextInt();
// Zufallszahlen erzeugen
double [] werte = new double [n];
for (int i = 0; i < n; i++) {
werte [i] = (double)(Math.random());
werte [i] = werte[i] * 10;
System.out.println(Math.round (werte [i]));
}
}
}
erstmal mein kommentierter Code zum Generieren ohne Duplikate:
Java:
public static void main(String[] args) {
Scanner Tastatur = new Scanner(System.in);
int n; //Anzahl der Werte
System.out.print("Anzahl der Zufallszahlen = ");
n = Tastatur.nextInt();
// Zufallszahlen erzeugen
double[] werte = new double[n];
for (int i = 0; i < n; i++) {
werte[i] = (double) (Math.random());
werte[i] = werte[i] * 10;
//schon hier runden => vergleich (ob doppelt) möglich
werte[i] = Math.round(werte[i]);
boolean schonInArray = false;
//alle vorigen werte im array durchgehen
for (int j = 0; j < i; j++) {
if (werte[j] == werte[i]) {
schonInArray = true;
break;
}
}
//bei doppeltem Wert, Schleifendurchlauf wiederholen => Gesamtzahl an Werten bleibt gleich
if (schonInArray) {
i--;
//Nur wenn NICHT doppelt ausgeben
} else {
System.out.println(werte[i]);
}
}
}
Zum Wertebereich:
Math.random gibt immer werte zwischen 0 und 1, du kannst aber durch Multiplikation wie in Zeile 14 (bei meinem Code) den wertebereich erweitern und ihn durch Addition verschieben.
Indem du z.B. "*50+25" rechnest werden aus werten zwischen 0 und 1, Werte zwischen 25 und 75.
Wenn du keine doppelten Zahlen willst, gibt es verschiedene mögliche Ansätze.
Hier sind mal zwei.
Die erste Methode eignet sich besonders gut für Kartenspiele. Die zweite ist besser, wenn der Zahlenbereich sehr gross ist, aber die Anzahl erzeugter Zahlen klein.
Java:
private static Random rand = new Random();
public static ArrayList<Integer> zufallsZahlen(int start, int end) {
ArrayList<Integer> list = new ArrayList<>();
for(int i = start; i < end; i++) list.add(i);
Collections.shuffle(list);
return list;
}
public static ArrayList<Integer> zufallsZahlen(int start, int end, int anzahl) {
HashSet<Integer> set = new HashSet<>();
for(int i = 0; i < anzahl; i++) {
int zahl = rand.nextInt(end-start)+start;
if(set.contains(zahl)) i--;
else set.add(zahl);
}
return new ArrayList<Integer>(set);
}