package main
import (
"fmt"
"math/rand"
"time"
)
func debug(list []string, randFn func([]string) []string) {
t := time.Now()
out := randFn(list)
// debugging stuff
d := time.Since(t)
ns := d.Seconds()
for _, v := range out {
fmt.Println(v)
}
fmt.Println("--------------------------")
fmt.Printf("took %fms to run\n", ns*1e3) // milliseconds
fmt.Println("--------------------------")
}
func randomize(list []string) []string {
ln := len(list)
// size hinting greatly improves map insert performance
randomized := make(map[int]int, ln)
// randomize the list...
for i := 0; i < ln; i++ {
r := rand.Intn(ln)
_, ok := randomized[r];
for ok {
r = rand.Intn(ln)
_, ok = randomized[r]
}
randomized[r] = r
}
// pull the map values out into a slice...
out := []string{}
for _, v := range randomized {
out = append(out, list[v])
}
return out
}
func main() {
rand.Seed(time.Now().UnixNano())
available_ads := []string{"capital one", "ford", "mcdonalds", "zappos"}
debug(available_ads, randomize)
debug(available_ads, randomize)
debug(available_ads, randomize)
debug(available_ads, randomize)
}