//Random selects # of min(all # of nodes,n) nodes randomly except exclude nodes. func Random(exclude node.Slice, num int) []*node.Node { all := getAllNodes() if exclude != nil { cand := make([]*node.Node, 0, len(all)) m := exclude.ToMap() for _, n := range all { if _, exist := m[n.Nodestr]; !exist { cand = append(cand, n) } } all = cand } n := all.Len() if num < n && num != 0 { n = num } r := make([]*node.Node, n) rs := rand.Perm(all.Len()) for i := 0; i < n; i++ { r[i] = all[rs[i]] } return r }