Skip to content

Instantly share code, notes, and snippets.

@jordanorelli
Created August 5, 2013 23:33
Show Gist options
  • Save jordanorelli/6160626 to your computer and use it in GitHub Desktop.
Save jordanorelli/6160626 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"math/rand"
"time"
)
type connection struct {
name string
affinity float64
}
var connections = []connection{
{"abe", 0.3},
{"bob", 0.2},
{"carly", 0.4},
{"dave", 0.7},
{"evan", 0.1},
{"francesca", 0.3},
{"gary", 0.4},
{"hogarth", 2.0},
{"ingrid", 0.4},
{"jorthon", 0.5},
}
func sum_affinities() float64 {
acc := 0.0
for _, c := range connections {
acc += c.affinity
}
return acc
}
func gen_number() float64 {
return sum_affinities() * rand.Float64()
}
func pick(n int) []string {
inner := func() string {
n, acc := gen_number(), 0.0
for i, c := range connections {
acc += c.affinity
if acc > n {
connections = append(connections[:i], connections[i+1:]...)
return c.name
}
}
panic("not reached")
}
picked := make([]string, 0, n)
for i := 0; i < n; i++ {
picked = append(picked, inner())
}
return picked
}
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(pick(5))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment