func (a *AddrBook) GetSelection() []*NetAddress {
	a.mtx.Lock()
	defer a.mtx.Unlock()

	if a.size() == 0 {
		return nil
	}

	allAddr := make([]*NetAddress, a.size())
	i := 0
	for _, v := range a.addrLookup {
		allAddr[i] = v.Addr
		i++
	}

	numAddresses := MaxInt(
		MinInt(minGetSelection, len(allAddr)),
		len(allAddr)*getSelectionPercent/100)
	numAddresses = MinInt(maxGetSelection, numAddresses)

	// Fisher-Yates shuffle the array. We only need to do the first
	// `numAddresses' since we are throwing the rest.
	for i := 0; i < numAddresses; i++ {
		// pick a number between current index and the end
		j := rand.Intn(len(allAddr)-i) + i
		allAddr[i], allAddr[j] = allAddr[j], allAddr[i]
	}

	// slice off the limit we are willing to share.
	return allAddr[:numAddresses]
}
func (a *AddrBook) GetSelection() []*NetAddress {
	a.mtx.Lock()
	defer a.mtx.Unlock()

	if a.size() == 0 {
		return nil
	}

	allAddr := make([]*NetAddress, a.size())
	i := 0
	for _, v := range a.addrLookup {
		allAddr[i] = v.Addr
		i++
	}

	numAddresses := MaxInt(
		MinInt(minGetSelection, len(allAddr)),
		len(allAddr)*getSelectionPercent/100)
	numAddresses = MinInt(maxGetSelection, numAddresses)

	
	
	for i := 0; i < numAddresses; i++ {
		
		j := rand.Intn(len(allAddr)-i) + i
		allAddr[i], allAddr[j] = allAddr[j], allAddr[i]
	}

	
	return allAddr[:numAddresses]
}
func ( a * AddrBook ) GetSelection ( ) [ ] * NetAddress { a . mtx . Lock ( ) defer a . mtx . Unlock ( ) if a . size ( ) == 0 { return nil } allAddr := make ( [ ] * NetAddress , a . size ( ) ) i := 0 for _ , v := range a . addrLookup { allAddr [ i ] = v . Addr i ++ } numAddresses := MaxInt ( MinInt ( minGetSelection , len ( allAddr ) ) , len ( allAddr ) * getSelectionPercent / 100 ) numAddresses = MinInt ( maxGetSelection , numAddresses ) // Fisher-Yates shuffle the array. We only need to do the first // `numAddresses' since we are throwing the rest. for i := 0 ; i < numAddresses ; i ++ { // pick a number between current index and the end j := rand . Intn ( len ( allAddr ) - i ) + i allAddr [ i ] , allAddr [ j ] = allAddr [ j ] , allAddr [ i ] } // slice off the limit we are willing to share. return allAddr [ : numAddresses ] }
/* Peer exchange */
// GetSelection randomly selects some addresses (old & new). Suitable for peer-exchange protocols.
/ * Peer exchange GetSelection randomly selects some addresses ( old & new ) . Suitable for peer - exchange protocols .