Приближается Рождество: пришло время определить, кто собирается сделать подарок кому. Я ищу такой алгоритм.Алгоритм определения пар из списка
Принимая список (1 to 10)
, например, создавать случайные пары, обеспечивающие, что:
- каждый элемент связан с другим элементом;
- Ни один из предметов не связан с самим собой;
- каждый элемент связан один раз и только один раз.
Так, очевидно, простая перетасовка не хватает:
Random.shuffle(1 to 10)
.toSeq
.zipWithIndex
Например:
1 -> 2
2 -> 4
3 -> 1
4 -> 3
Но не (1
делает подарок себе):
1 -> 1
2 -> 3
3 -> 4
4 -> 2
Я думал о ограничениях на HList, но:
- Я не был в состоянии выразить это
- Это может быть немного излишним (даже если это смешно)
- Там могут быть алгоритмы, которые гарантируют, что «по построению»
Вы можете просто повторить перетасовку до тех пор, пока условия не будут выполнены, возможно, это займет всего две или три попытки. –
Это на самом деле вариант: он, вероятно, сработает. Но только ради любопытства, мне было интересно, было ли что-то более элегантное. –
@PeterdeRivaz не нужно повторять весь случайный перетасовка. Где я работаю, мы используем beanie: бросаем все имена, каждый выбирает один; если вы сами получите подарок, просто верните свое имя и выберите другое. –