in swim/memberlist.go [231:247]
func (m *memberlist) RandomPingableMembers(n int, excluding map[string]bool) []Member {
members := make([]Member, 0, n)
m.members.RLock()
indices := rand.Perm(len(m.members.list))
for _, index := range indices {
member := m.members.list[index]
if m.Pingable(*member) && !excluding[member.Address] {
members = append(members, *member)
if len(members) >= n {
break
}
}
}
m.members.RUnlock()
return members
}