vendredi 1 décembre 2017

go random generator stops working after some calls

I want shuffle db ids so that none of the id refer to themselves, but with this piece of code:

package main

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

func main() {
    seed := time.Now().UnixNano() & 999999999
    log.Print("seed: ", seed)
    rand.Seed(seed)
    ordered := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}

    randomized := shufflePreventCollision(ordered)
    log.Print("Final Result")
    log.Print("ordered: ", ordered)
    log.Print("random:  ", randomized)

}

func shufflePreventCollision(ordered []int) []int {
    randomized := rand.Perm(len(ordered))
    for i, o := range ordered {
        if o == randomized[i] {
            log.Printf("Doing it again because ordered[%d] (%d) is == randomized[%d] (%d)", i, o, i, randomized[i])
            log.Print(ordered)
            log.Print(randomized)
            shufflePreventCollision(ordered)
        }
    }
    return randomized
}

I find a strange behaviour, when it runs often it at some point hangs and cannot find non-colliding sequences anymore. I tried go build -o rand_example3 rand_example3.go && time (for i in $(seq 10000) ; do ./rand_example3 ; done)

And it seems to never end. Am I missing some understanding here or is there really something fishy with math/rand?




Aucun commentaire:

Enregistrer un commentaire