Я пытаюсь реализовать функцию перетасовки строк в Go, которая использует крипто/ранд вместо математики/ранда. Для Fisher-Yates Shuffle требуются случайные целые числа, поэтому я попытался реализовать эту функциональность без необходимости использовать crypto/rand Int, который опирается на math/big. Ниже приведено лучшее, что я придумал до сих пор, но есть ли лучший метод? Тот факт, что я не могу найти существующие примеры, заставляет меня задаться вопросом, есть ли веская причина, по которой никто этого не делает!
package main
import "crypto/rand"
import "fmt"
import "encoding/binary"
func randomInt(max int) int {
var n uint16
binary.Read(rand.Reader, binary.LittleEndian, &n)
return int(n) % max
}
func shuffle(s *[]string) {
slice := *s
for i := range slice {
j := randomInt(i + 1)
slice[i], slice[j] = slice[j], slice[i]
}
*s = slice
}
func main() {
slice := []string{"a", "b", "c", "d", "e", "f", "h", "i", "j", "k"}
shuffle(&slice)
fmt.Println(slice)
}