PHP-Array-Generierung Herausforderung

8

Ich muss zufällig ein zweidimensionales n-by-n-Array erzeugen. In diesem Beispiel ist n = 10. Das Array sollte diese Struktur haben. Ein Beispiel:

%Vor%

wo

%Vor%

Wie Sie sehen, ist es wie eine Matrix von Zahlen, jede Zeile davon und Spalte besteht auch aus den Zahlen 0-9, und es gibt nie eine Zahl zweimal in jeder Zeile oder in jeder Spalte. wie man ein solches Array erzeugt und jedes Mal zufällig.

    
MR.GEWA 18.07.2010, 08:13
quelle

3 Antworten

7

Okay, also hier ist meine Version:

%Vor%

Dies sollte ein sehr schneller Algorithmus sein, da er nur zwei zufällige Arrays generiert und keinerlei Swapping beinhaltet. Es sollte auch zufällig sein, aber ich kann es nicht beweisen. (Zumindest weiß ich nicht, wie ich so etwas beweisen soll.)

Dies ist eine optimierte Version eines sehr einfachen Algorithmus:

Zuerst wird auf diese Weise eine nicht zufällige Matrix erzeugt (stellen Sie sich vor, wir wollen nur 5 * 5, nicht 10 * 10):

%Vor%

In dieser Matrix tauschen wir jetzt Spalten zufällig aus. Da wir die Spalten nicht selbst ändern, werden Ihre Regeln weiterhin befolgt. Dann tauschen wir zufällig Reihen aus.

Wie Sie sehen, vertauscht der obige Algorithmus nichts und erzeugt auch nicht die obige Matrix. Das liegt daran, dass die Spalten und Zeilen im Voraus generiert werden ( $v1 und $v2 ) und dann direkt in die richtige Position im resultierenden Array geschrieben wird.

Edit: Habe gerade ein Benchmarking gemacht: Für $n = 500 braucht es 0,3 Sekunden.

Edit2: Nach dem Ersetzen der for-Schleifen mit foreach-Schleifen dauert es nur 0,2 Sekunden.

    
NikiC 18.07.2010, 10:04
quelle
2

Das habe ich getan. Erstellt eine gültige Matrix (2d-Array), die nicht zufällig ist. Also beginnend ist Reihe 0 0-9, Reihe 1 ist 1-0 (dh: 1,2,3 ... 8,9,0), Reihe 2 ist 2-1 (2,3 ... 9, 0,1) ... Reihe 8 ist 8-7 ... usw. Dann mischen Sie das Array, um die Zeilen zu randomisieren, und führen Sie einen einfachen Spaltenwechsel durch, um die Spalten zu randomisieren. Sollte genau das zurückbekommen, was Sie wollen. Versuchen Sie Folgendes:

%Vor%

Wenn ich in meiner Lösung kein zufälliges Array erzeuge und überprüfe, ob es bereits existiert, sollte es viel schneller laufen (besonders wenn das Array jemals über 0-9 ging). Wenn Sie in die letzte Reihe kommen, gibt es nur eine mögliche Kombination von Zahlen. Sie werden zufällige Arrays erzeugen, die versuchen, diese eine Antwort zu finden. Es wäre ziemlich genau so, als würde man eine Zahl von 1 bis 10 auswählen und eine Zufallszahl generieren, bis sie die von Ihnen gewählte Zahl erreicht. Es könnte beim ersten Versuch sein, aber dann könnten Sie 1000 Zufallszahlen wählen und nie die gewünschte erhalten.

    
Jonathan Kuhn 18.07.2010 08:55
quelle
0

Hmm .. Ich sehe, du hast schon gute Antworten, aber hier ist meine Version:

%Vor%

Beispielausgabe:

%Vor%

Erzeugt ein zufälliges zufälliges Array als Startpunkt Dann geht es durch das Seed-Array, wobei jedes Element als Ausgangspunkt für sich genommen wird, um eine neue Basis zu erstellen.

    
Dennis Haarbrink 18.07.2010 08:58
quelle