Thanks Martin for the clarification! Yet this inconsistent behavior is daunting. What version of Go is playground using? x86? GopherJS? Better be something wrong with playground! :)
On Fri, Jun 24, 2016 at 5:08 PM Martin Geisler <mar...@geisler.net> wrote: > On Fri, Jun 24, 2016 at 1:05 PM, dc0d <kaveh.shahbaz...@gmail.com> wrote: > > > > Hi; > > > > To shuffle items in a slice I'm doing this: > > > > var res []Item > > > > //fill res logic > > > > shuffle := make(map[int]*Item) > > for k, v := range res { > > shuffle[k] = &v > > } > > res = nil > > for _, v := range shuffle { > > res = append(res, *v) > > } > > > > Which inserts items into a map then ranges over that map. Ranging over a > map in Go returns the items in random order. > > > > 1 - I thought it's a cool trick! > > 2 - Is anything bad about doing this? > > While iteration over a map is said to be random, it isn't specified > exactly how "random" the iteration is. The spec says > > https://golang.org/ref/spec#RangeClause > The iteration order over maps is not specified and is not guaranteed > to be the same from one iteration to the next. > > That is, the iteration order should not to be relied upon. A simple test > like > > https://play.golang.org/p/czRE3pbMzc > > shows this: the keys are printed in a scrambled order. When I run this > on my machine, I get a different order every time, but on the > playground the order seems to be fixed and I get "0 5 7 1 2 3 4 6 8 9" > every time. My guess would be that an external input is used to > initialize the hash function used behind the scene -- and on the > playground that input somehow has a fixed value. > > Unless you're build a toy application, my advice would be to use a > real random generator to generate indexes into the map. Use these > indexes to swap elements and permute the array as Konstantin mentioned > (https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). > > -- > Martin Geisler > -- Regards, Kaveh Shahbazian -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.