Hallo zusammen,
ich sollte einen Array mit Objekten haben, die jedoch alle unterschiedliche Zahlen haben und welche mit Randoma ls Zufallszahlen erzeugt werden sollen.
Jedoch ist es so, dass manche Zufallszahlen trotz schleife doppelt vorkommen, woran liegts?:
liegt es daran, dass ich eigentlich in der while nochmals ein neues Random-Objekt erzeuge?
Dies dürfte meiner Meinung nach jedoch egal sein, da ich den Array "alleObjekte" durchlaufe und dort die Zahlen vergleiche, oder?
der relevante Code-Teil:
Java:
for(int i =0; i < alleObjekte.length; i++){Random r =newRandom();String zufallszahlStr = nf.format(Math.abs(r.nextInt(9999999)));
zufallszahlInt =Integer.parseInt(zufallszahlStr);Objekt objekt2 =newObjekt();
alleObjekte[i]= objekt2;for(int j =0; j == i; j++){while(alleObjekte[j].getNumber()== zufallszahlInt){
r =newRandom();// hier der Fehler?
zufallszahlStr = nf.format(Math.abs(r.nextInt(9999999)));
zufallszahlInt =Integer.parseInt(zufallszahlStr);}}
objekt2.setNumber(zufallszahlInt);}
staticfinalRandom r =newRandom();//braucht man wirklich nur einmalfor(int i =0; i < alleObjekte.length; i++){
alleObjekte[i]=newObjekt();int zufallszahl =0;do{boolean found =true;
zufallszahl = r.nextInt(9999999);for(int j =0; j < i; j++){if(alleObjekte[j].getNumber()== zufallszahl){
found =false;break;}}}while(! found);
alleObjekte[i].setNumber(zufallszahl);}
Neues Random ist unnötig. Was du mit der Umwandlung in einen String und dann wieder in eine Zahl erreichen willst, erschließt sich mir auch nicht ganz.
Zum Schluss noch der Tipp, ein paar System.out.printlns mit nützlichen Infos einzustreuen, um solche Fehler zu finden.
Set<Integer> intSet =newHashSet<Integer>();staticfinalRandom r =newRandom();
intSet.clear();//direkt vor der Schleife aufrufen for(int i =0; i < alleObjekte.length; i++){
alleObjekte[i]=newObjekt();int zufallszahl =0;do{
zufallszahl = r.nextInt(9999999);}while(intSet.contains(zufallszahl));
intSet.add(zufallszahl);
alleObjekte[i].setNumber(zufallszahl);}
Das Set ist doch nur dafür da, um leichter zu überprüfen, ob du eine Zufallszahl schon hattest, deine Objekte sind doch immer noch im Array. Die neue Version ist wesentlich schneller, sobald das Array etwas länger wird.
und Da die Ausgabe später 7-Stellig sein muss ist es die Variante mit dem String.
Das ist ein dickes Ei! Zahlen, Datumse usw. haben in Java kein "Format", du kannst einem int nicht sagen, dass es siebenstellig ist. Du speicherst einfach die Zahl "wie sie ist", und am Ende, wenn du sie brauchst, formatierst du sie ganz nach Belieben (mit Numberformat oder String.format oder wie auch immer)
Kann man sagen, dass es letzlich nur an dem part der "do"-schleife gefehlt hat, also dass die Bedingung für die Schleife nicht gepasst hat?
Da ist ein prinzipieller Denkfehler drinne. Angenommen, du hast bei deiner Version schon die zufallszahl 42 an Stelle 0 und 57 an Stelle 1. Jetzt "ziehst" du die 57. Test an der ersten Stelle: Unterschiedlich. Test an der zweiten Stelle: Gleich! Also geht die Zufallszahl nicht, du ziehst nochmal. Es kommt die 42, und die ist ungleich 57, Zufallszahl gefunden! Es ist aber trotzdem ein Duplikat, weil du nach der Neuziehung nicht wieder ganz von vorn durchgetestet hast.
Bei jeder gezogenen Zufallszahl zu überprüfen, ob sie bereits gezogen wurde, ist eine gute Lösung, falls der Bereich der möglichen Zahlen sehr viel größer ist als die Anzahl zu ziehender Zahlen.
Falls man aber z.B. 90 von 100 möglichen Zahlen ziehen möchte, werden mit der obigen Lösung u.U. seeehr viele Zufallszahlen erzeugt, da die Wahrscheinlichkeit, eine bereits gezogene zu ziehen, einfach sehr groß ist.
Dann bietet es sich an, ein Array mit allen möglichen Zahlen zu erzeugen, genügend Zahlen zu durchmischen und diese schließlich zurückzugeben.
Java:
importjava.util.Arrays;importjava.util.Random;publicclassZufall{publicstaticint[]random_numbers_between(int smallest,int largest,int how_many){int range = largest - smallest +1;if(how_many > range)thrownewIllegalArgumentException();int[] array =newint[range];for(int i =0; i < range;++i)
array[i]= smallest + i;Random rand =newRandom();for(int i =0; i < how_many;++i)swap(array, i, i + rand.nextInt(range - i));return how_many == range ? array :Arrays.copyOf(array, how_many);}privatestaticvoidswap(int[] array,int i,int k){int temp = array[i];
array[i]= array[k];
array[k]= temp;}publicstaticvoidmain(String[] args){int[] numbers =random_numbers_between(1,100,90);System.out.println(Arrays.toString(numbers));}}