Vier Stellen Keine Doppelt (Zufall)

Status
Nicht offen für weitere Antworten.

CeadeS

Mitglied
Hallo und Gute Nacht, :lol:
Wie im Titel beschrieben sitze ich jetzt schon bereits mehrere Tage an einem Problem. :###
Ich möchte gerne eine Zufallszahl erstellen mit 4 Stellen und 10 Ziffern, welche jedoch nicht doppelt vorkommen dürfen. Sprich 1467 und nicht 1417.
Ich habe mir bereits ein Verfahren ausgedacht welches mit Vertauschung arbeitet.
Ich generiere ein Array welches so Aussieht:

0|1|2|3|4|5|6|7|8|9

Nun Vertausche ich die Stellen mit einer Zufallszahl an jeder einzelnen Stelle.
Das Heißt:

0|1|2|3|4|5|6|7|8|9

Zufallszahl :3 also

2|1|0|3|4|5|6|7|8|9

Als nächstes z.B. Zufallszahl :7 also

2|1|6|3|4|5|0|7|8|9

Dies Ziehe ich nun bis zur letzten STelle durch und nehme die ersten oder letzten 4 Ziffern und speichere sie in meine Zahl ab.

Kennt irgendjemand vielleicht einen Weg, dies noch Effizienter durchführen zu können?

Hier die Vertauschung:
Code:
public class Zufall{
  public static void main(String[] args){
    int[] zahlen={0,1,2,3,4,5,6,7,8,9};
    // jetzt mischen, jede darf einmal
    for(int i=0; i<10; ++i){
      int j=(int)(Math.random()*10);
      int schieben=zahlen[i];
      zahlen[i]=zahlen[j];
      zahlen[j]=schieben;
    }
Ich glaube das dies nicht die effizienteste Methode ist und frage deshalb einmal in diesem Forum nach.
Ich möchte den Kürzesten und unaufwändigsten Code haben- *Zwang* :D
Gruß
 

Wildcard

Top Contributor
Also am einfachsten geht's IMO so:
Code:
		List<Integer> digitList = new ArrayList<Integer>();
		for(int i=0;i<10;i++)
			digitList.add(i);
		Collections.shuffle(digitList);
		for(int i=0;i<4;i++)
			System.out.print(digitList.get(i));
Wenn's um Performance geht hat man entweder die Wahl verwendete Zahlen aus der Auswahl zu entfernen, oder beim ziehen zu prüfen ob die Zahl schon gezogen wurde und evtl. neu ziehen. Was performanter ist hängt von der Anzahl der vorhandenen Zeichen und der Länge der gewünschten Ausgabe ab.
 

CeadeS

Mitglied
Danke danke mein Prog is um ganze 3 Sekunden schneller geworden. :lol: :lol: :applaus:
[schild=6 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]java-forum.org 4 the Win[/schild]
 

Wildcard

Top Contributor
Freut mich ja das ich helfen konnte, aber wenn du das öfter ausführst und es um Performance geht hast du hoffentlich nicht meinen Code verwendet! Sag bitte das nicht :lol:
 

RaoulDuke

Bekanntes Mitglied
Also wenn ich die beiden Codeschnipsel ausführe und die Ausführungszeit messe, dann ist die erste Lösung etwa um den Faktor 10 schneller als zweite Lösung.
 

Wildcard

Top Contributor
Na auf den Test bin ich gespannt :lol:
Du hast auch sicher die Laufzeitoptimierung des JiT Compilers berücksichtigt? :wink:
Zeig doch bitte mal deinen Testcode
 

RaoulDuke

Bekanntes Mitglied
Ich hab einfach nur vorher und hinterher System.nanoTime() aufgerufen und die Differenz der Werte genommen. Das gibt bei beliebig häufigen aufrufen immer das ergebniss das der erste Codeschnipsel schneller fertig ist. Daher nehme ich einfach mal ganz naiv an das die erste Routine auch wirklich schneller arbeitet.
 

Wildcard

Top Contributor
Ich hab ehrlich gesagt keine Ahnung welche schneller ist da ich's nicht versucht habe, und ich ja auch nur eine einfache und nicht eine schnelle Methode geposted habe.
Tatsache ist aber das solche Messungen niemals genau und oftmals völlig falsch sind.
Da der JiT Compiler ständig zur Laufzeit optimiert und der Ausgangscode unter Umständen nicht mehr viel mit dem Original zu tun hat sind solche Aussagen sehr schwierig zu treffen.
 

RaoulDuke

Bekanntes Mitglied
Ich habs mal durch den Netbeans Profiler laufen lassen.

Version 1 braucht bei mir ca 0.6ms.

Bei Version 2 gehen alleine schon ~2,5ms drauf weil jeder der 10 "digitList.add(i)" ein Objekt vom Typ Integer erzeugt. Und ~1,2ms verbraucht der Classloader noch für irgendwas.

Denke nicht das sich das durch irgendwelchen Compileroptimierungen beheben lässt. Version 1 arbeitet komplett mit primitiven Datentypen und erzeugt nicht irgendwelche Objekte. War eigentlich zu erwarten das es schneller ist.

Version 1 wird übrigens nochmal um Faktor 10 schneller wenn man die Variablen i,j und schieben schon vor der Schleife Deklariert.
 

byte

Top Contributor
Der Compiler optimiert auch nicht "ständig". Nach ein paar Durchläufen ändert sich da nix mehr bei solch kurzen Snippets.

Und das Arrays performanter sind als Collections, sollte eigentlich bekannt sein. ;)
 

RaoulDuke

Bekanntes Mitglied
Hab die Snipplets jetzt nochmal 1000 mal hintereinander laufen lassen, dann ändert sich das Verhältnis etwas.

Version 1 braucht 43ms, Version 2 braucht 78ms und Version 1 mit Variablen ausserhalb der Schleife deklariert braucht insgesamt 29ms.

Scheinbar wurde es doch etwas optimiert bei den vielen Durchläufen, macht aber immernoch nen deutlichen Unterschied.
 

Wildcard

Top Contributor
Um mal zu zeigen wie extrem aussagekräftig das ist (mit faktor 10 und so...) :roll:
Code:
public class Randomzahl
{
	
	static StringBuilder builder;
	static Random random = new Random();
	
	
	public static String methode1()
	{
		int[] zahlen={0,1,2,3,4,5,6,7,8,9};
	    // jetzt mischen, jede darf einmal
	    for(int i=0; i<10; ++i){
	      int j=(int)(Math.random()*10);
	      int schieben=zahlen[i];
	      zahlen[i]=zahlen[j];
	      zahlen[j]=schieben;
	    }
	    builder = new StringBuilder();
	    for(int i=0;i<4;i++)
	    	builder.append(zahlen[i]);
	    //System.out.println(builder.toString());
	    return builder.toString();
	}
	
	public static String methode2()
	{
		List<Integer> digitList = new ArrayList<Integer>();
		for(int i=0;i<10;i++)
			digitList.add(i);
		Collections.shuffle(digitList);
		builder = new StringBuilder();
		for(int i=0;i<4;i++)
			builder.append(digitList.get(i));
		//System.out.println(builder.toString());
		return builder.toString();
	}
	
	public static String methode3()
	{
		int[] zahlen={0,1,2,3,4,5,6,7,8,9};
		int zahl;
		int counter=0;
		int number;
		builder = new StringBuilder();
		while(counter<4)
		{
			number=random.nextInt(10);
			zahl = zahlen[number];
			if(zahl>-1)
			{
				builder.append(zahl);
				zahlen[number]=-1;
				counter++;
			}
		}
		//System.out.println(builder.toString());
		return builder.toString();
	}
	
	public static void main(String[] args)
	{
		long time1 = System.nanoTime();
		for(int i=0;i<100000;i++)
			methode1();
		long time2 = System.nanoTime();
		long time3 = System.nanoTime();
		for(int i=0;i<100000;i++)
			methode2();
		long time4 = System.nanoTime();
		long time5 = System.nanoTime();
		for(int i=0;i<100000;i++)
			methode3();
		long time6 = System.nanoTime();
		System.out.println(time2-time1);
		System.out.println(time4-time3);
		System.out.println(time6-time5);
	}
}
ausgabe:
Code:
235774938
300535683
86306500
 

RaoulDuke

Bekanntes Mitglied
Das der Faktor 10 bei 1000 Durchläufen nicht zutrifft habe ich ja auch gerade geschrieben. Bei einem einzigen Durchlauf passt er aber ganz gut.
 

Wildcard

Top Contributor
Ein Durchlauf ist nichts. überhaupt nichts. Da ist die Systemzeit überhauptnicht genau genug
Und wenn da irgendwo bspw. ein print drinsteht kannst du den Rest der Messung sowieso vergessen.
 

RaoulDuke

Bekanntes Mitglied
Wenn die Systemzeit zu ungenau wäre, dann hätte ich nicht jedes mal mit Abweichung +/- 10% die gleichen Werte?

Und die prints habe ich genau aus dem Grund bei meinen Messungen aussen vor gelassen.
 

RaoulDuke

Bekanntes Mitglied
Das es ungenau ist habe ich ja garnicht angezweifelt. Aber es ist offenbar genau genug für diesen Zweck, sonst hätte ich keine halbwegs reproduzierbaren Ergebnisse.

Ausserdem hab ich für die letzteren Tests nicht mit den Nanosekunden gearbeitet, sondern den Netbeans Profiler genommen. Ich unterstelle einfach mal das der halbwegs genau messen kann. Und die Messunterschiede waren reproduzierbar im Bereich mehrerer Millisekunden.
 

Wildcard

Top Contributor
Es steht ja wohl ausser Frage das die Messung je länger sie dauert akurater wird.
Und wie du siehst sind die Unterschiede minimal (zumindest bei den beiden ersten Methoden).
Zum vergleich nach 10 Millionen durchläufen:
Code:
21096391581
29166956135
8745036590
 

RaoulDuke

Bekanntes Mitglied
Wildcard hat gesagt.:
Es steht ja wohl ausser Frage das die Messung je länger sie dauert akurater wird.
Und wie du siehst sind die Unterschiede minimal (zumindest bei den beiden ersten Methoden).
Zum vergleich nach 10 Millionen durchläufen:
Code:
21096391581
29166956135
8745036590

Sicher, haste recht. Bei vielen Durchläufen bin ich ja auch zu keinen anderen Ergebnissen gekommen. Da greift aber wie du schon sagtest sicherlich die automatische Optimierung, mich interessierte aber auch wie schnell der Code bei einer Erstausführung unoptimiert läuft. Und mit mehreren Durchläufen ist es nunmal nicht möglich die unoptimierte Ausführungszeit zu messen, oder kann man die Optimierung irgendwo zu Testzwecken abstellen?
 

Wildcard

Top Contributor
RaoulDuke hat gesagt.:
kann man die Optimierung irgendwo zu Testzwecken abstellen?
Keine Ahnung. Rein interessehalber: sag bescheid wenn du dementsprechend was findest :)

Edit Illuvatar, 9.6. 23:17: Getrolle abgetrennt nach da
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
F Vier gewinnt Diagonal überprüfen Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
V 2D-Grafik Vier gewinnt Problem Allgemeine Java-Themen 5
K Vier Threads streiten sich. :( Allgemeine Java-Themen 3
S Vier Bedinungen Allgemeine Java-Themen 10
M Vier gewinnt: Auswertung Allgemeine Java-Themen 4
LimDul Eindeutige ID (ala UUID) generieren als numerisch, maximal 16 Stellen Allgemeine Java-Themen 11
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
I DOM-Parser - Element im Element an bestimmten Stellen auslesen Allgemeine Java-Themen 1
MiMa Datum von zweistelliger Jahreszahl auf 4 Stellen aufrüsten? Allgemeine Java-Themen 4
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
KilledByCheese String an bestimmten Stellen teilen Allgemeine Java-Themen 2
H Eclipse x Stellen einer Zahl in array speichern Allgemeine Java-Themen 3
G Methoden Methode aus Java 1.6 auf Java 1.4 bereit stellen Allgemeine Java-Themen 12
P Variable in Array stellen Allgemeine Java-Themen 11
P Java Anwendung mehr Speicher zur Verfügung stellen?? Allgemeine Java-Themen 3
B Java in HTML stellen Allgemeine Java-Themen 11
B Stellen abschneiden Allgemeine Java-Themen 2
H tastatur von englisch auf deutsch stellen Allgemeine Java-Themen 3
reibi double-Wert auf 2 Stellen nach dem Komma abschneiden Allgemeine Java-Themen 6
P HashMap an 2 Stellen veränderbar Allgemeine Java-Themen 13
M Uhrzeit im PC stellen Allgemeine Java-Themen 2
G Double Zahl auf 4 Stellen hinter Komma kuerzen Allgemeine Java-Themen 4
A Float-Wert auf 2 Stellen nach den Komma runden ? Allgemeine Java-Themen 2
berserkerdq2 Kann keine Labels erstellen, was ist hier syntaktisch falsch Allgemeine Java-Themen 5
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
pkm javax.script.ScriptEngineManager gibt mir keine Engine Allgemeine Java-Themen 4
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
Tobero Eclipse Runnable jar exportiert keine Textures? Allgemeine Java-Themen 12
S createTempFile erstellt keine temporäre Datei Allgemeine Java-Themen 13
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
Thallius Keine Ahnung Allgemeine Java-Themen 15
M WSDL: Doppelte Typenames (Keine Verwendung möglich) Allgemeine Java-Themen 5
L JPA keine shared primary key Allgemeine Java-Themen 11
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
N Warum habe ich keine Spaltenüberschriften? Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
Bluedaishi Input/Output Bluetooth Bondrucker MZ220 keine Verbindung Allgemeine Java-Themen 0
F Cardlayout prüfen ob schon vorhanden, keine doppelten Allgemeine Java-Themen 3
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
M Eclipse Keine Ausgabe mehr bei Fehlern Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
V Files mit Umlauten ergeben keine Größe Allgemeine Java-Themen 9
S Bekomme mit Scanner und URL keine Html-Seite ausgelesen Allgemeine Java-Themen 3
127.0.0.1 Subversion neues SVN Projekt, keine Main gefunden ?! Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
M keine Bilder in .jar-Datei (java) Allgemeine Java-Themen 23
D Chat - keine Schrift sichtbar Allgemeine Java-Themen 4
J Eclipse Elipse gibt mir keine Vorschläge mehr :( Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
S Tomcat java.util.logging - keine Logs Allgemeine Java-Themen 12
Guybrush Threepwood Warten, bis keine Taste gedrückt Allgemeine Java-Themen 11
S Keine NullPointerExceptions in nebenläufigen Threads Allgemeine Java-Themen 21
T Batch-File / keine Verbindung zur DerbyDB Allgemeine Java-Themen 3
O Zugriff auf Serielle Schnittstelle - Keine Ports gefunden. Allgemeine Java-Themen 8
X Warum kann ich keine ZIP Datein mit renameto() in was anderes benennen? Allgemeine Java-Themen 13
B warum keine nested blocks Allgemeine Java-Themen 2
GilbertGrape Jetty-Dienst startet keine Programme mit Oberfläche Allgemeine Java-Themen 2
S Keine Exception-Warning in Eclipse Allgemeine Java-Themen 3
D Warum keine Mehrfachvererbung? Allgemeine Java-Themen 5
tfa Keine Closures in Java 7 (?) Allgemeine Java-Themen 17
J Probleme wenn man keine serialVersionUID definiert? Allgemeine Java-Themen 27
G PrintWriter in .jar erstellt keine Datei Allgemeine Java-Themen 4
F Kann man keine Arrays von generischen Typen erstellen? Allgemeine Java-Themen 2
G Javadoc generiert keine Links zu java.lang Klassen? Allgemeine Java-Themen 4
A ArrayListe :Doppelte entfernen -> keine Referenzen Allgemeine Java-Themen 26
ARadauer Random keine Zahlen doppelt Allgemeine Java-Themen 4
T Wieso erfolgt keine Ausgabe. /Excel Allgemeine Java-Themen 19
F GregorianCalendar wirft keine Fehler bei z.b. Monat 17 Allgemeine Java-Themen 3
G Jarfile gibt keine Textnachrichten aus Allgemeine Java-Themen 2
J java vnc client verbessern: KeyEvent.VK_ALT keine Wirkung? Allgemeine Java-Themen 12
J jar-Datei enthält keine Main-Class Allgemeine Java-Themen 22
N Keine Klassen startbar/mit Abhängigkeiten erstellbar Allgemeine Java-Themen 2
WMaerz Der neue JDK 6 enthält keine javac.exe, tool.jar usw. Allgemeine Java-Themen 6
P Webhosting-Paket unterstützt nur .war Dateien keine jsp Allgemeine Java-Themen 4
A Kann keine neue Klasse erstellen. Allgemeine Java-Themen 3
D TextPane nach Laden keine Styles Allgemeine Java-Themen 2
A JSP include - keine Fehlermeldung Allgemeine Java-Themen 2
H Vektoren nehmen keine neuen Werte an Allgemeine Java-Themen 5
N Applet übernimmt keine Änderungen Allgemeine Java-Themen 13
N Euklidischer Algorithmus in Java und keine Terminierung. Allgemeine Java-Themen 7
C Java zeigt keine Fensterinhalte Allgemeine Java-Themen 3
G Leere Fenster (Keine Schrift, Reiter/ Buttons) bei Java Allgemeine Java-Themen 5
G woher installiertes JDK? (keine Adminrechte) Allgemeine Java-Themen 3
R keine sqrt methode für bigintegers? Allgemeine Java-Themen 14
D NullPointerException wo keine sein sollte. Allgemeine Java-Themen 2
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3
C Sound: Keine Line gefunden. Zu großer internal buffer? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben