package main import ( "bytes" "crypto/rand" "fmt" "math/big" "os" "path/filepath" ) func main() { root := "." if len(os.Args) > 1 { root = os.Args[1] } files := make([]string, 0, 32) err := filepath.Walk(root, func(p string, f os.FileInfo, err error) error { if err != nil { return err } if !f.IsDir() { files = append(files, p) } return nil }) if err != nil { fmt.Fprintf(os.Stderr, "** Error: %s\n", err.Error()) os.Exit(1) } var b [16]byte _, err = rand.Read(b[:]) if err != nil { fmt.Fprintf(os.Stderr, "Failed to access cryptographic randomness. " + "Error: %s\n\n", err.Error()) os.Exit(1) } i, err := rand.Int(bytes.NewReader(b[:]), big.NewInt(int64(len(files)))) if err != nil { fmt.Fprintf(os.Stderr, "Failed to get a random int. Error: %s\n", err.Error()) os.Exit(1) } j := int(i.Uint64()) fmt.Printf("%s\n", files[j]) }