Пользователь вводит через пробел несколько любых чисел, букв, слов или чего угодно. Ну допустим даже он вводит номиналы карт (раздача в покере), типа A 3 J Q 10. Наша задача эти карты перемешать.
Для этого оч клёво (и просто) использовать Алгоритм Фишера-Йетса. Этот алгоритм работает путем итерации массива, начиная с последнего элемента, и замены текущего элемента на случайно выбранный элемент. Процесс повторяется до тех пор, пока не будет достигнут первый элемент. В результате получается случайно перетасованный массив.
Вот мой кучерявый код этого «тасования»:
package main import ( "bufio" "fmt" "math/rand" "os" "strings" "time" ) func main() { r := bufio.NewReader(os.Stdin) s, _ := r.ReadString('\n') s = strings.TrimSpace(s) parsed := strings.Fields(s) len := len(parsed) rand.Seed(time.Now().UnixNano()) for i := len - 1; i > 0; i-- { j := rand.Intn(i) parsed[i], parsed[j] = parsed[j], parsed[i] } fmt.Print(parsed) }
Объяснение:
В функции main
программа создает новый объект reader
для чтения ввода от пользователя, а затем использует этот объект для чтения строки слов, введенных пользователем. Затем программа удаляет лишние пробелы и разбивает строку на отдельные слова.
Далее программа создает переменную len
, которая хранит количество слов в списке. Затем она использует функцию rand.Seed
для запуска генератора случайных чисел, чтобы он генерировал разные случайные числа при каждом запуске цикла. Цикл, который будет выполняться столько раз, сколько слов в списке. На каждой итерации цикла программа генерирует случайное число в диапазоне от 0
до текущего значения переменной цикла i
и присваивает его переменной j
. Затем она меняет местами слово в позиции i
со словом в позиции j
в списке.
Наконец, программа распечатывает перетасованный список слов для просмотра пользователем. Алгоритм перестановки Фишера-Ятса гарантирует, что каждое возможное упорядочивание списка одинаково вероятно.