Algorithmus zur Randomisierung der Ausgabereihenfolge kurzer Arrays in Go

WBOY
Freigeben: 2024-02-15 12:57:08
nach vorne
773 Leute haben es durchsucht

Go 中短数组的输出顺序随机化的算法

Der PHP-Editor Xiaoxin bringt Ihnen einen Artikel über den Algorithmus zum Randomisieren der Ausgabereihenfolge kurzer Arrays in der Go-Sprache. In der Go-Sprache ist die Ausgabereihenfolge kurzer Arrays undefiniert, was auf die Parallelitätseigenschaften der Go-Sprache zurückzuführen ist. In diesem Artikel wird ein Algorithmus vorgestellt, der auf einem Zufallszahlengenerator basiert und die Ausgabereihenfolge kurzer Arrays randomisieren kann, sodass die Ausgabereihenfolge bei jeder Programmausführung unterschiedlich ist, wodurch die Flexibilität und Variabilität des Programms erhöht wird. Durch die Lektüre dieses Artikels können Leser erfahren, wie sie die Ausgabereihenfolge kurzer Arrays in der Go-Sprache randomisieren und auf ihre eigenen Projekte anwenden können.

Frageninhalt

Der Hauptunterschied zwischen dieser Frage und den zahlreichen doppelten Antworten besteht darin, dass das Eingabearray sehr kurz ist, nur 3 Elemente. --

Angenommen, ich habe einen bestellten Satz int. Die Größe des Arrays beträgt nur 3 (oder mehr). Ich muss ihre Reihenfolge randomisieren und ein neues Array zurückgeben. Obwohl es sich um eine reine Algorithmusfrage handelt, ist die bevorzugte Antwortsprache go.

  • Wie kann ich mit Python eine Liste in zufälliger Reihenfolge ausgeben? Die Antwort ist random.shuffle.
  • Mit go, https://yourbasic.org/golang/shuffle-slice-array/, sollte die Antwort rand.shuffle lauten.

Aber hier ist mein Code:

https://go.dev/play/p/cvu8_q96-9f

func randshuffle(a []int) {
    rand.seed(time.now().unixnano())
    rand.shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] })
}
Nach dem Login kopieren

Hier sind die Ergebnisse eines meiner Testläufe:

[2 1 3]
[1 3 2]
[2 1 3]
[2 1 3]
[1 3 2]
[1 2 3]
[2 3 1]
Nach dem Login kopieren

Das scheint nicht sehr zufällig zu sein.

Irgendwelche guten Ideen für eine bessere Randomisierung für kurze Arrays mit drei Elementen?

Übrigens,

  • Wie man Array-Elemente in zufälliger Reihenfolge mit vhdl ausgibt, sagt, dass man ein Schieberegister mit linearer Rückkopplung verwenden soll, aber ich denke, dass das keine gute Idee für dieses Problem ist.
  • Wie randomisiert (mischt) man ein Javascript-Array? Angesichts des Durstenfeld-Mischalgorithmus, einer optimierten Version von Fisher-Yates, werden die Ergebnisse meiner Meinung nach denen von Go sehr ähnlich sein rand.shuffle. Ja?

Workaround

Verschieben random.seed von der Zufallsfunktion zur Hauptfunktion. Ein Prng kann nur einmal pro Programm gesät werden, und eine erfolgreiche Nachahmung der Zufälligkeit wird durch Zustandsübergänge des Generators und nicht durch den Samen erreicht. Führen Sie kein erneutes Seeding durch, es sei denn, Sie verstehen wirklich, wie PRNG funktioniert, und versuchen, den Prozess aus Gründen der Reproduzierbarkeit explizit zu steuern.

Die folgenden einfachen Änderungen am Code werden Ihren Anforderungen gerecht:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.seed(time.now().unixnano())

    a := []int{1, 2, 3}
    for i := 0; i < 10; i++ {
        randshuffle(a)
        fmt.println(a)
    }
}

func randshuffle(a []int) {
    rand.shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] })
}
Nach dem Login kopieren

Dies führt zu folgendem Ergebnis:

[2 3 1]
[3 1 2]
[2 1 3]
[2 3 1]
[1 2 3]
[1 3 2]
[1 2 3]
[3 1 2]
[3 2 1]
[2 3 1]
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAlgorithmus zur Randomisierung der Ausgabereihenfolge kurzer Arrays in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage