#java
Готовлю новогоднюю вечеринку с друзьями, решили сыграть в тайного санту. Но до нового года не встречаемся, поэтому жеребьевка удаленно. Захотелось поиграться с кодом, вышел вот такой: Secret Santa Algorithm Цель - рандомно раскидать кто кому дарит подарок, так, чтобы не вышло ситуации, что человек дарит самому себе) Смущает наличие костыля if (j + 1 == guests.get(j)) Как думаете, что можно улучшить? Ожидается лаконичный, простой, не зависающий на большом количестве участников, выполняющий свою задачу алгоритм. import java.util.*; class Rextester { public static void main(String args[]) { int GUESTS_NUMBER = 10; Listguests = new ArrayList<>(); for (int i = 0; i < GUESTS_NUMBER;) { guests.add(++i); } boolean shuffled = false; outer: while (!shuffled) { Collections.shuffle(guests); shuffled = true; for (int j = 0; j < guests.size(); j++) { if (j + 1 == guests.get(j)) { shuffled = false; continue outer; } } } for (int j = 0; j < guests.size(); j++) System.out.println(j + 1 + " gives a gift to -> " + guests.get(j)); } }
Ответы
Ответ 1
А почему бы не сделать так? Перенумеровать участников, пусть их n. Сгенерировать коллекцию { 1, 2, ..., n } и перетасовать её (Collections.shuffle) Участник в первым номером в полученной коллекции делает подарок второму участнику в коллекции, второй — третьему, третий — четвёртому, ..., последний — первому. Алгоритм генерирует просто цикл длины n. Особенность — никогда не будут сгенерированы несколько коротких циклов, всегда только один длинный.Ответ 2
В Вашем алгоритме можно в цикле сделать проверку, если дарим самому себе, меняемся со следующим в очереди, если последний то с первым. Вот мой вариант: public class Test { public static void main(String args[]) { int SANTA_NUMBERS = 10; ListsantaList = new ArrayList<>(); for (int i = 0; i < SANTA_NUMBERS; ) { santaList.add(++i); } List guests = new ArrayList<>(santaList); Collections.shuffle(guests); //в этом цикле проверяем for (int i = 0; i < santaList.size(); i++) { if (santaList.get(i) == guests.get(i)) { if (i + 1 < santaList.size()){ Integer receiver = guests.get(i + 1); guests.set(i + 1, guests.get(i)); guests.set(i , receiver); }else { Integer receiver = guests.get(1); guests.set(1, guests.get(i)); guests.set(i , receiver); } } } for (int j = 0; j < santaList.size(); j++) System.out.println(santaList.get(j) + " gives a gift to -> " + guests.get(j)); } }
Комментариев нет:
Отправить комментарий