Elemente eines Arrays mischen

Status
Nicht offen für weitere Antworten.

Thorsten

Mitglied
Hallo :)

Ich hab mal ne kleine Herausforderung für alle:

Ich suche eine Möglichkeit, ein Array zu mischen,
und wieder zurück zu sortieren -- mit Hilfe der
Mathematik.

Also ein Array so richtig gut durchwürfeln, aber
halt berechenbar -- um es wieder zurück zu bekommen. :D

Folgendes Szenario:
===================
Ich habe ein Array, dass gemischt werden soll. Danach
wird es auf die Festplatte geschrieben. Nun soll es
irgendwann wieder geladen werden, und in seinen originalen
Zustand zurück finden...

Das muss alles gehen, ohne ein extra Array auf die Festplatte
zu schreiben!

Infos:
======
Zur Verfügung steht: Das Eingabearray in der Form int[] mit
sehr vielen Einträgen... geht in die Millionen. 8)

Dann ein Array mit festen Werten (byte[]). Das ist etwa 20
Einträge lang. Dieses Array muss auch benutzt werden.
Es kann auch später noch eindeutig einem großen Array zugeordnet
werden.

Das war es. Damit muss man auskommen. Man kann natürlich
alle normalen mathematischen Funktionen benutzen, wie cos,
sin, exp und so weiter...

Bedingungen:
============
Es sollte in endlicher Zeit zum Ergebnis führen. :wink: Also sagen wir
mal bis zu einer Sekunde für eine Millionen Einträge im Hauptarray!
So in der Art... darf also keine Minuten dauern...

Das Hauptarray soll aber nicht nur einfach um x Einträge
verschoben werden. Also jeden Eintrag um x Positionen verschieben.
Das ist zu einfach!

Und die Arrays dürfen auch nicht vergrößert werden.


Meine eigene Idee:
===================
Die beste Lösung geht wohl leider nicht:
Ich würde am liebsten alle Einträge im Hauptarray einfach nach dem
Wert sortieren. Die niedrigsten alle nach links, die höhsten weit nach
rechts.

Das wäre die beste Lösung -- für mich!

Aber wie will man dann die Positionen der Werte rekonstruieren? Ja,
man braucht ein zweites Array, wo die Positionen drinne sind. Aber
wenn das Hauptarray 5 Millionen Einträge hat, muss man 10 Millionen
auf die Festplatte schreiben. Die Dateien werden mir einfach zu groß! :shock:

Mir fällt einfach nichts gutes ein :(
 

Reality

Top Contributor
Zum Mischen erzeugst du Zufallszahlen. Die zufällig erzeugten Zahlen kannst du ja zur Widerherstellung speichern.

Liebe Grüße
Reality
 

Thorsten

Mitglied
Das geht doch auch nicht:
Ich müsste eine Losung (wie beim Lotto) durchführen -- im Prinzip.

Also:
In einer Schleife liefert mir ein Randomizer Zahlen. Wenn er eine
hat, die im Bereich des Hauptarrays liegt, muss diese Zahl aus
der Liste gelöscht werden. Damit sie kein 2. mal benutzt wird.

Und so wird es am Ende sehr lange dauern, bis er die letzten
"gezogen" hat :wink:

Oder hab ich einen Denkfehler? ???:L
 
B

bygones

Gast
verwandel den Array temporär in eine Liste über Arrays.asList(array) und dann kannst du über das Collection Framework einmal Collections.shuffle(list) die Liste durchwühlen und dann per Collections.sort(list) sortieren. und wenn du willst kannst du dann wieder per list.toArray() das Ganze in einen Array umwandlen ....

meinst du sowas ?
 

Isaac

Bekanntes Mitglied
Wenn ich ihn richtig verstanden habe will er die Liste zwar randomizen aber eben aufgrund einer mathematischen Funktion. Also z.b. aus der Position und des Wertes eines int im Array. Um dann später, wenn das Array wieder zurück gelesen wird die Ausgangslage wieder her zustellen indem die Funktion einfach umgekehrt wird.

Ist aber nicht ganz trivial das ganze. Wenn es denn ohne Metadaten zu erzeugen überhaubt möglich ist.
 

Thorsten

Mitglied
Also... ich hab jetzt ne Lösung :D Ich habe die Frage in 4 Foren gestellt :wink:
Da das andere Forum kein Partner-Forum von diesem ist, kopiere ich mal nur
den Code:

Code:
public class bla
{
	static String bla = "abcd";
   	static byte[] blub = bla.getBytes();
   	static int last;
	
   public static void main (String [] args)
   {
      int [] array= new int[15];
      
      for(int i = 0 ; i < array.length ; ++i) array[i] = i;
      System.out.println("Original:");
      printArray(array);
      shuffle(array);
      System.out.println("gemischt:");
      printArray(array);
      reShuffle(array);
      System.out.println("Wiederhergestellt:");
      printArray(array);
   }
   
   public static void printArray(int[] array)
   {
      for(int i = 0 ; i < array.length ; ++i)
      {
         System.out.print(array[i] + "  ");
      }
      System.out.println();
   }
   
   public static void shuffle(int [] array)
   {  	
   	  int counter = -1;
      for(int i = array.length - 1; i > 0 ; --i)
      {
      	
      	if (++counter == blub.length)
      	{
      		counter = 0;
      	}
      	
         int swapIndex = getSwapIndex(array.length,i,blub[counter]);
         int temp = array[swapIndex];
         array[swapIndex] = array[i];
         array[i] = temp;
      }
      
      last = counter;
   }
   
   public static void reShuffle(int [] array)
   {
   	  //Fehler
   	  //bla = "abce";
   	  //blub = bla.getBytes();
   	
   	  int counter = last + 1;
      for(int i = 1 ; i <  array.length ; ++i)
      {
      	
      	 if (--counter == -1)
      	 {
      	 	counter = blub.length - 1;
      	 }
      	
         int swapIndex = getSwapIndex(array.length,i,blub[counter]);
         int temp = array[swapIndex];
         array[swapIndex] = array[i];
         array[i] = temp;
      }
   }
   
   public static int getSwapIndex(int numberOfSwaps, int currentSwap, byte bla)
   {
      double temp = StrictMath.sin(1/(0.0005 + currentSwap * (0.1 / ( (double)numberOfSwaps + (bla*100 )) )));
      temp = StrictMath.abs(temp);
      return (int)StrictMath.round(temp*(double)currentSwap);
   }
}

Der springende Punkt ist die Gleichung y = sin(1/x) :) Funktioniert perfekt :shock: Besser, als ich dachte.
Wenn mein Programm für'n Beta-Test bereit ist, werdet ihr sehen, wozu das Ganze :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G anzahl "verwendeter" elemente eines arrays ermitte Allgemeine Java-Themen 2
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
R Elemente eines Vectors [Java 1.4] Allgemeine Java-Themen 5
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
K Neue Elemente in JList einfügen Allgemeine Java-Themen 2
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
S GUI - Drag & Drop Elemente Allgemeine Java-Themen 10
J Elemente zu einer List hinzufügen? Allgemeine Java-Themen 9
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
M Elemente aus ArrayList, die in ArrayList ist Allgemeine Java-Themen 2
Z Elemente einer HashTabelle gezielt ansprechen Allgemeine Java-Themen 10
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
C Auf Oberflaechen Elemente zugreifen Allgemeine Java-Themen 8
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
Iron Monkey Array-Elemente Allgemeine Java-Themen 9
S Array: Anzahl Elemente mit best. Wert zählen Allgemeine Java-Themen 4
B Liste auf gleiche Elemente untersuchen? Allgemeine Java-Themen 2
C Auf ArrayList Elemente referenzieren? Allgemeine Java-Themen 17
M Progblem bei Zugriff auf Array Elemente Allgemeine Java-Themen 4
der JoJo [TreeSelection] wie bekomme ich alle Elemente Allgemeine Java-Themen 4
G Alle Möglichkeiten n Elemente Anzuordnen. Allgemeine Java-Themen 13
M Elemente aus Liste entfernen? Allgemeine Java-Themen 7
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
E Reihenfolge der Elemente einer ArrayList? Allgemeine Java-Themen 4
J Netbeans: wie auf grafische elemente zugreifen, andere Datei Allgemeine Java-Themen 2
B Nach Deserialisieren: Elemente des JFrames ohne Funktion Allgemeine Java-Themen 5
G Umkehrung der Array Elemente Allgemeine Java-Themen 2
K Elemente im ArrayList vergleichen Allgemeine Java-Themen 9
F Elemente überdecken sich! Allgemeine Java-Themen 13
S alle elemente aus hashmap lesen Allgemeine Java-Themen 8
C Collection, LinkedList, Elemente Allgemeine Java-Themen 4
S Einzelne Elemente in einer Bild Datei Allgemeine Java-Themen 5
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Vorbereitung eines Praktikums Allgemeine Java-Themen 4
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
M Weiterleiten von empfangenen Nachrichten eines StompSessionHandlers Allgemeine Java-Themen 1
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
H Rename eines Projekts Allgemeine Java-Themen 1
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
Meeresgott Erste Schritte Sourcetree - Git | Suchen eines Commits Allgemeine Java-Themen 2
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Verbindung eines Java-Plugins mit Webserver Allgemeine Java-Themen 3
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
M Rechenprogramm eines wissenschaftlichen Taschenrechners Allgemeine Java-Themen 4
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
E Typüberprüfung eines chars Allgemeine Java-Themen 5
H Hilfe bei Erstellung eines Hilfe Fenster bei Tastendruck (F1 bei Win98) Allgemeine Java-Themen 5
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben