Maison > développement back-end > Golang > Distribution uniforme ou brassage naïf ?

Distribution uniforme ou brassage naïf ?

王林
Libérer: 2024-02-09 08:30:09
avant
909 Les gens l'ont consulté

Distribution uniforme ou brassage naïf ?

L'éditeur PHP Xiaoxin révélera la relation entre "distribution uniforme et brassage naïf". En informatique, la lecture aléatoire est une opération importante souvent utilisée pour randomiser des données ou des collections. Une distribution uniforme signifie que la distribution des nombres aléatoires est moyenne dans une certaine plage. Alors, le brassage peut-il assurer une distribution uniforme ? La réponse n’est pas simple, alors explorons cette question ensemble.

Contenu de la question

Je mélange un tableau de 3 entiers 6 millions de fois. J'enregistre chaque permutation du tableau dans une carte. Vous trouverez ci-dessous le code utilisant go.

package main

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

func randrange(min, max int) int {
    return rand.intn(max-min+1) + min
}

func naiveshuffle(arr *[3]int) {
    for i := 0; i < 3; i++ {
        e := randrange(0, 2)
        arr[e], arr[i] = arr[i], arr[e]
    }
}

func main() {
    rand.seed(time.now().unixnano())
    m := make(map[[3]int]int, 6)
    arr := [3]int{-6,10,184}

    for i := 1; i <= 6000000; i++ {
        a := arr
        naiveshuffle(&arr)
        m[a]++
    }

    for k, v := range m {
        fmt.println(k, ":", v)
    }

}
Copier après la connexion

Puisque je fais un simple mélange, je crois comprendre qu'il ne devrait pas pas produire une permutation uniformément répartie. Mais voici ce que j'ai obtenu :

[184 -6 10] : 1000074
[184 10 -6] : 1000764
[-6 10 184] : 1000766
[10 184 -6] : 998090
[-6 184 10] : 1000479
[10 -6 184] : 999827
Copier après la connexion

Cela montre que chacune des 6 permutations possibles se produit environ 1 million de fois. Pourquoi la distribution que je reçois semble-t-elle uniforme ?

EDIT : code modifié pour ne lancer qu'une seule fois. J'obtiens maintenant :

[-6 184 10] : 999507
[184 -6 10] : 1000401
[10 -6 184] : 1002163
[10 184 -6] : 999236
[-6 10 184] : 999016
[184 10 -6] : 999677
Copier après la connexion

Edit 2 : Grâce à Hobbs, j'ai réalisé que j'avais fait une erreur stupide. Je devrais mélanger a,而不是 arr. J'obtiens maintenant :

[10 -6 184] : 1111056
[-6 10 184] : 888442
[184 -6 10] : 888576
[10 184 -6] : 1109896
[-6 184 10] : 1113148
[184 10 -6] : 888882
Copier après la connexion

Solution de contournement

Vous avez mélangé arr plus de 6 millions de fois sans le restaurer à son état d'origine entre les mélanges - en d'autres termes, vos 6 millions d'essais n'étaient pas indépendants du . Bien que les permutations de chaque mélange soient inégalement réparties, empiler ces permutations les unes sur les autres 6 millions de fois produit une distribution très proche de l'uniforme.

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal