Maison  >  Article  >  développement back-end  >  Algorithme pour randomiser l'ordre de sortie des tableaux courts dans Go

Algorithme pour randomiser l'ordre de sortie des tableaux courts dans Go

WBOY
WBOYavant
2024-02-15 12:57:08771parcourir

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

L'éditeur PHP Xiaoxin vous propose un article sur l'algorithme de randomisation de l'ordre de sortie des tableaux courts en langage Go. Dans le langage Go, l'ordre de sortie des tableaux courts n'est pas défini, ce qui est dû aux caractéristiques de concurrence du langage Go. Cet article présentera un algorithme basé sur un générateur de nombres aléatoires, capable de randomiser l'ordre de sortie de tableaux courts, de sorte que l'ordre de sortie soit différent à chaque fois que le programme est exécuté, augmentant ainsi la flexibilité et la variabilité du programme. En lisant cet article, les lecteurs peuvent apprendre à randomiser l'ordre de sortie de tableaux courts dans le langage Go et à l'appliquer à leurs propres projets.

Contenu de la question

La principale différence entre cette question et les nombreuses réponses en double est que le tableau d'entrée est très court, seulement 3 éléments. --

Supposons que j'ai un ensemble commandé de int. La taille du tableau n'est que de 3 (ou plus). Je dois randomiser leur ordre et renvoyer un nouveau tableau. Bien qu’il s’agisse d’une question purement algorithmique, le langage de réponse préféré est Go.

  • En utilisant python, comment afficher une liste dans un ordre aléatoire ? La réponse est random.shuffle.
  • En utilisant go, https://yourbasic.org/golang/shuffle-slice-array/, la réponse devrait être rand.shuffle.

Mais voici mon 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] })
}

Voici l'un des résultats de mon test :

[2 1 3]
[1 3 2]
[2 1 3]
[2 1 3]
[1 3 2]
[1 2 3]
[2 3 1]

Cela ne semble pas très aléatoire.

Avez-vous de bonnes idées pour une meilleure randomisation pour les tableaux courts à trois éléments ?

Au fait,

  • Comment générer des éléments de tableau dans un ordre aléatoire à l'aide de vhdl indique d'utiliser un registre à décalage à rétroaction linéaire, mais je pense que ce n'est pas une bonne idée pour ce problème.
  • Comment randomiser (mélanger) un tableau javascript ? Compte tenu de l'algorithme de mélange de Durstenfeld, une version optimisée de Fisher-Yates. Mais je pense que ses résultats seront très similaires à ceux de Go rand.shuffle. Ouais?

Solution de contournement

Déplacez random.seed de la fonction aléatoire à la fonction principale. Un prng ne peut être généré qu'une seule fois par programme, et une imitation réussie du caractère aléatoire est obtenue grâce aux transitions d'état du générateur plutôt qu'à la graine. Ne réamorcez pas à moins que vous ne compreniez vraiment comment prng fonctionne et que vous essayiez de contrôler explicitement le processus pour des raisons telles que la reproductibilité.

Les simples modifications suivantes au code répondront à vos besoins :

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] })
}

Cela produira le résultat suivant :

[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]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer