Datentypen Mehrere int Variablen miteinander vergleichen

R

Replax

Gast
Hallo zusammen,

Ich habe ein Problem mit ein paar Integer Variablen, und zwar habe ich 5 int Variablen, welchen ich jeweils ein zufallswert zuweise:

Java:
int z1 = rnd.nextInt(intervall);
int z2 = rnd.nextInt(intervall);
int z3 = rnd.nextInt(intervall);
int z4 = rnd.nextInt(intervall);
int z5 = rnd.nextInt(intervall);

wie bekomme ich es jetzt möglichst kurz hin, das die Variablen miteinander verglichen werden, sodass kein Variablenwert doppelt vorkommt ?

lg replax
 
R

Replax

Gast
Ja aber bei einer if-anweisung wird doch dann die bedingung ziemlich lang, da ich jede variable mit jeder vergleichen muss, also:
Java:
if (z1==z2||z1==z3||z1==z4||z1==z5||z2==z3||z2==z4||z2==z5||z3==z4||z3==z5||z4==z4)
{
     // Alle Variablen neu generieren
}

Bei 5 Variablen geht das ja noch, aber was ist wenn ich jetzt 10, 20 oder 100 habe ?!

Mit switch kann ich mir das ganze jetzt nicht vorstellen...
 

Firestorm87

Bekanntes Mitglied
Wie wärs mit nem Set? (keine doppelten werte), oder einer liste und dann die abfrage mit contains...

/edit: too late und auch noch fehler drin gehabt :D
 
R

Replax

Gast
Ne die aufgabe habe ich nicht, kann also Arrays benutzen :D
Eine genaue Aufgabenstellung habe ich allerdings auch nicht.

Allerdings möchte ich 5 Variablen einen Zufallswert zuweisen, welcher aber NICHT gleich sein darf.
Aber ich muss mit den Werten auch weiterhin rechnen können.
 

Firestorm87

Bekanntes Mitglied
Dann würde Ich einfach ne ArrayList anlegen, diese kann ganz einfach gefragt werden, ob Sie einen bestimmten Wert schon enthält und die weiterverwendung der elemente is easy...
 
R

Replax

Gast
ok vielen dank für eure hilfe, ich schaue mal wie weit ich damit komme:)
bei weiteren fragen meld ich mich wieder...

lg replax
 

Marco13

Top Contributor
Man kann das "irgendwie" machen. Und das funktioniert dann. Aber wenn man ein bißchen (wirklich nur ein bißchen) theoretisch ausholt, ist das gar nicht so leicht.

Man hat - je nachdem, worum es genau geht - verschiedene Möglichkeiten:
- Man könnte so lange Elemente in eine Set einfügen, bis sie die benötigte Größe hat
- Man könnte alle Zahlen des Intervalls mischen, und sich 5 davon rauspicken.

Wenn man ersteres macht, dann sollte man wirklich ein Set verwenden, und keine ArrayList. Festzustellen, dass ein Element NICHT in einer List enthalten ist, ist relativ aufwändig.
Das Problem dabei ist in jedem Fall: Es terminiert nicht notwendigerweise. Wenn man das für deinen Fall schreiben würde, wäre das ja
Java:
int invervall = ...
Set<Integer> set = new HashSet<Integer>();
while (set.size() < 5)
{
    set.add(rnd.nextInt(intervall));
}
Ganz trivial und straightforward. Und dann setzt man mal für "invervall" den Wert 4 ein, und schaut, wie weit man kommt :D OK, sowas kann (und sollte) man vorher abfragen, aber selbst wenn man ein Intervall von 100000 verwendet, ist nicht sichergestellt, dass das Programm irgendwann fertig ist.


Die zweite Lösung wäre sowas wie
Java:
int invervall = ...
List<Integer> list = new ArrayList<Integer>();
for (int i=0; i<intervall; i++)
{
    list.add(i);
}
Collections.shuffle(list);
List<Integer> result = list.subList(0,5);
Auch ganz trivial und straightforward. Und dann setzt man mal für "invervall" den Wert 2000000000 ein, und schaut, wie weit man kommt :D Der "Vorteil" ist, dass dieses Verfahren garantiert terminiert.

Man könnte sagen, dass des vom Verhältnis zwischen Intervallgröße und Anzahl der Zahlen abhängt, welches Verfahren man wählen sollte. (Auch wenn das nicht-terminieren im ersten Fall eher ein theoretisches Problem ist, kann sowas bei einem Intervall von 1000000 und 999999 zu ziehenden Zahlen schon eine ganze Weile dauern...).

Wobei die Frage schon öfter aufgetaucht ist. Mal überlegen, ob man da nichteine Lösung finden kann, die garantiert terminiert, OHNE bei großen Intervallen astronomisch viel Speicher zu benötigen :reflect:
 

0x7F800000

Top Contributor
Wobei die Frage schon öfter aufgetaucht ist. Mal überlegen, ob man da nichteine Lösung finden kann, die garantiert terminiert, OHNE bei großen Intervallen astronomisch viel Speicher zu benötigen :reflect:
Code:
import java.util.*;
public class LinearRandomPick {
	
	public static long mod(long n, long m){
		return ((n%=m)<0)?n+m:n;
	}
	
	public static Long get(Long index, Map<Long,Long> replacements){
		if(replacements.containsKey(index)){
			return replacements.get(index);
		}else{
			return index;
		}
	}
	
	public static List<Long> pick(int number, long intervalEnd){
		
		HashMap<Long,Long> alreadyUsed=new HashMap<Long,Long>();	//O(1)
		List<Long> result = new LinkedList<Long>();					//O(1)
		Random r = new Random();									//O(1)
		
		for(int i=0; i<number; i++){								
			long pickedIndex = mod(r.nextLong(),(intervalEnd-i));				//O(1)
			long pickedNumber = get(pickedIndex, alreadyUsed);				//O(1)
			result.add(pickedNumber);										//O(1)
			alreadyUsed.put(pickedIndex,get(intervalEnd-1-i,alreadyUsed));	//O(1)
		}															//O(number)
		
		return result;
	}
	
	public static void main(String..._){
		System.out.println(pick(5,5));
		System.out.println(pick(5,10));
		System.out.println(pick(5,100));
		System.out.println(pick(5,1000000000));
		System.out.println(pick(5,Long.MAX_VALUE));
		
		System.out.println(pick(2,2));
		System.out.println(pick(10,10));
		System.out.println(pick(100,100));
	}
}
So ungefähr? ;) Erwartet läufts linear in der Anzahl der zu wählenden Zahlen, der Speicherbedarf ist ebenfalls O(number), da bei jedem schleifendurchlauf einmal eingefügt wird.

Die Idee ist ähnlich wie beim linearen shuffle-Algorithmus auf einem Array, wo die einträge geswappt werden. Nur gibt es hier kein Array, sondern stattdessen die Menge aller Longs, und es wird nur virtuell geswappt, indem bereits gepickte Longs durch eine HashMap auf ihre "virtuellen swap-Partner" gemappt werden.

...Hey Marco^^ :)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ach, auch mal wieder da ;)

Von der Grundidee her wäre ich wohl ähnlich vorgegangen: Es mußte was sein, was indirekt auf der shuffle-Idee basiert, aber man sollte nicht den kompletten Array speichern müssen, sondern nur die Information, wo welche Zahl nach dem Shufflen gelandet wäre. Einerseits dachte ich: "Das kann ja nicht sooo schwer sein"... andererseits hätte ich nicht gedacht, dass das SO "einfach" ist - "einfach" aber im Sinne von: Wenig code. In bezug auf das, was man macht, ist das, was du da gebastelt hast, nämlich IMHO nicht "einfach", sondern schon ziemlich tricky - habe kurz versucht, es nachzuvollziehen, aber ... SO (kurz) hätte ich das wohl nicht hinbekommen :toll:

Ich bin aber auch immer ein bißchen vorsichtig mit Zufallszahlen, Wahrscheinlichkeiten und dem ganzen Kram - da kann man sich leicht auf die Fre... legen. In diesem Fall dachte ich beim ersten Durchlesen auch, dass durch das
[c]get(intervalEnd-1-i,alreadyUsed)[/c]
vielleicht größere Zahlen (am Ende des Intervalls) "bevorzugt" werden könnten, aber bei einem kurzen Histogrammartigen Test sah' es dann doch gleichverteilt aus ... Also: Wenn die Frage mal wieder auftaucht, weiß ich, auf welchen Beitrag ich verlinken kann :applaus:
 

Marco13

Top Contributor
Hab den code dort jetzt nicht angesehen, aber ... wenn man damit auch ganz isoliert die k ersten Elemente der x-ten Permutation von n Elementen rausfinden kann, wäre das vielleicht auch eine Möglichkeit. Aber ob die dann noch kürzer ist, als die Lösung von Andrey...?
 

Landei

Top Contributor
Hmmm, ich glaube, ich denke zu kompliziert. Für den Aufgabenfall reicht ja schon sowas:
Java:
  public static Iterator<Integer> randomPickIterator(final int max){
    return new Iterator<Integer>() {
      private final Random random = new Random();
      private final Set<Integer> set = new TreeSet<Integer>();
     
      public boolean hasNext() { return set.size() < max; }
      public Integer next() {
        int r = random.nextInt(max - set.size());
        for(Integer k : set) { if(r >= k) r++; }
        set.add(r);
        return r;
      }
      public void remove() {  throw new UnsupportedOperationException();  }
    };
  }
 

Marco13

Top Contributor
Ich glaube ich denke zu kompliziert - oder resigniere zu schnell nach dem Aufstellen der Vermutung, es könnte kompliziert sein, und denke darum nicht darüber hinaus ... wie kommt ihr auf sowas? ;( Das scheint auch richtig zu sein ... und dabei ist egal, dass es O(n*k) statt O(n) hat - offenbar ist doch mal wieder jedes Problem so einfach, die die Lösung, die man clevererweise dafür findet... :(
 

Landei

Top Contributor
Wie man auf sowas kommt kann ich in diesem Fall recht genau beantworten:

Mir war klar, dass man immer weniger Möglichkeiten hat und deshalb immer kleinere Zufallsbereiche braucht. In einen Zufallsbereich schieben sich aber nachträglich die schon gezogenen Zahlen "irgendwie dazwischen". Das Bild, das ich im Kopf hatte, war so eine Art unregelmäßige Ziehharmonika, wo sich die bereits gezogenen Zahlen im aktuellen Zufallsbereich "auffalten":
Ziehe Zufallszahl im um die Anzahl der schon gezogenen Zahlen verkleinertem Bereich:
----X----
Die schon vorhandenen Zahlen "falten" sich dazwischen auf:
--v-v-X-v---
Das ergibt die "echte" Position der neuen Zahl (zwischen den bereits vorhandenen):
--+-+-X-+---

Die praktische Umsetzung war dann einfach: Wenn ich Zahlen von 0 bis 9 haben will, und meinetwegen die fünf schon gezogen ist, brauche ich als nächstes nur noch eine Zufallszahl von 0 bis 8, muss diese aber eins nach oben verschieben, wenn ich eine 5 oder größer gezogen habe (das wäre die "Auffalt-Operation"). Die nächste Zufallszahl braucht dann nur noch von 0 bis 7, ich muss aber für die beiden vorangegangenen Zahlen wieder diese Verschiebung nach oben machen, und zwar nacheinander. Das "nacheinander" klappt nur, wenn diese aufsteigend geordnet sind, deshalb ein TreeSet.

Datenstrukturen und einfache Algorithmen sind für mich recht "plastisch", ich sehe die Operationen im Kopf ablaufen. Ich kann mir nicht vorstellen, wie man ohne diese Fähigkeit programmieren kann, aber inzwischen kenne ich genügend Leute, bei denen das nicht so (oder nicht so ausgeprägt) ist, und die trotzdem gute Programme schreiben, und kenne auch die Erklärungsansätze für diesen Unterschied (wie das Modell von Myers-Briggs, wo ich natürlich zu den "Intuitiven" zähle). Hin und wieder platze ich "spontan" mit einer richtigen Lösung heraus, und dann wissen meine Kollegen nicht, was sie davon halten sollen (ich fürchte irgendwann holen sie mal einen Exorzisten).
 
Zuletzt bearbeitet:

Marco13

Top Contributor
So betrachtet klingt das schon fast erschreckend einleuchtend ... :( Wenn ich versuchen sollte, das mir selbst gegenüber zu rechtfertigen, würde mir jetzt kaum was anderes einfallen als die Verblödung, die daraus resultiert, dass man die meiste Zeit des Tages nicht denken muss, sondern seine Zeit mit sinnlosem Office-Mist verschwendet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
H wie mehrere variablen in einfacher for-schleife? Java Basics - Anfänger-Themen 2
D variablen über mehrere Klassen Java Basics - Anfänger-Themen 12
M Mehrere Variablen gleichzeitig ändern Java Basics - Anfänger-Themen 11
T Mehrere Variablen gleichzeitig initialisieren Java Basics - Anfänger-Themen 2
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
Buroto Klassen Mehrere .txt Datein verbienden und anschließend auslisten Java Basics - Anfänger-Themen 10
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
M mehrere Rückgabenwerte aus Methode Java Basics - Anfänger-Themen 7
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
C Mehrere Zufallswerte Java Basics - Anfänger-Themen 4
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
Henri Mehrere Ordner umbenennen Java Basics - Anfänger-Themen 11
E Mehrere Arrays addieren mit Übertrag Java Basics - Anfänger-Themen 13
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
J Mehrere paintComponenten in einem Programm Java Basics - Anfänger-Themen 0
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
B Jeweils den Parent bekommen -> mehrere Ebenen Java Basics - Anfänger-Themen 2
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
L Mehrere Jars im Unterordner Java Basics - Anfänger-Themen 2
L LibGDX - mehrere Screens Java Basics - Anfänger-Themen 1
J Sudoku mehrere Lösungen Java Basics - Anfänger-Themen 29
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
T Mehrere JFrames gleichzeitig öffnen Java Basics - Anfänger-Themen 6
O Erste Schritte Scanner mehrere male benutzen (Konsole) Java Basics - Anfänger-Themen 7
S mehrere If Bedingungen Java Basics - Anfänger-Themen 5
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
B Mehrere Zahlen speichern Java Basics - Anfänger-Themen 60
M mehrere extends? Java Basics - Anfänger-Themen 19
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
C ButtonController löst mehrere Methoden aus Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
F mehrere eingegebene Zahlen mit Zahlen von 1-9 multiplizieren Java Basics - Anfänger-Themen 18
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Mehrere Eingabefelder programmiert (Zeigt Fehler an) Java Basics - Anfänger-Themen 6
Jinnai4 Mehrere Textfelder überprüfen Java Basics - Anfänger-Themen 16
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
N Integers aus Textdatei auslesen und mehrere Arrays erstellen Java Basics - Anfänger-Themen 9
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
J Mehrere IF Anweisungen und dazugehörige ELSE Java Basics - Anfänger-Themen 6
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10
A Mehrere Radiobuttons Java Basics - Anfänger-Themen 3
B Klassen Mehrere Objekte mit Schleife erstellen - How? Java Basics - Anfänger-Themen 1
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
V OOP Aufnahme von Dreiecken in ein/mehrere Objekte Java Basics - Anfänger-Themen 0
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
C Klasse auf mehrere Objekte zugreifen lassen Java Basics - Anfänger-Themen 26
G Mehrere If-else-Sätze der Reihe nach durchlaufen lassen Java Basics - Anfänger-Themen 2
K Mehrere String.valueOf() kürzer schreiben / "packen"? Java Basics - Anfänger-Themen 2
F String mehrere male ausgeben? Java Basics - Anfänger-Themen 4
H möglichkeiten für for-schleife? (mehrere ausgangsvariablen?) Java Basics - Anfänger-Themen 9
M PdfBox - mehrere Formularseiten Java Basics - Anfänger-Themen 2
Z Mehrere XML-Dateien zu einer zusammenfügen Java Basics - Anfänger-Themen 3
M GUI- mehrere Komponenten auf Container adden Java Basics - Anfänger-Themen 2
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
F Methoden split() - Mehrere Zeichen Java Basics - Anfänger-Themen 5
F Erste Schritte Mehrere nextInt() Eingaben nebeneinander ausgeben Java Basics - Anfänger-Themen 12
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
A Mehrere 100.000 Elemente verlgeichen Java Basics - Anfänger-Themen 8
T Compiler-Fehler Mit Array und "for" mehrere ImageIcon erstellen Java Basics - Anfänger-Themen 7
N Mehrere berechnungen auf einem Button legen? Java Basics - Anfänger-Themen 19
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Speicherlast mehrere GB durch kleine png files? Java Basics - Anfänger-Themen 1
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben