Язык Go. Алгоритм Фишера-Йетса


Пользователь вводит через пробел несколько любых чисел, букв, слов или чего угодно. Ну допустим даже он вводит номиналы карт (раздача в покере), типа 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 в списке.

Наконец, программа распечатывает перетасованный список слов для просмотра пользователем. Алгоритм перестановки Фишера-Ятса гарантирует, что каждое возможное упорядочивание списка одинаково вероятно.


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.