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.

Reply via email to