2013-08-23 3 views
0

Я кодирую секретную программу santa, которая печатает уникальный секретный Санта всех участников и не повторяет вывод на том же входе.случайное число разный выход каждый раз

Мои проблемы:

  1. Программа генерирует тот же результат на некоторых повторы ...
  2. Программа зависает после первого запуска, если больше или равно 3 имени в списке. Он печатает правильный вывод только для нескольких записей. Напр. 3 имени он печатает секретные santas из 2 имен и зависает!

Код выглядит следующим образом.

SecretSanta ss=new SecretSanta(); 
    Scanner scn=new Scanner(System.in); 

    do 
    { 
     System.out.println("Add the participants name:-"); 
     String name=scn.next().trim(); 
     ss.names.add(name); 
     ss.santa.add(name); 
     System.out.println("Do u want to add more names?"); 
     System.out.println(" 1-YES 2-NO"); 
     choice=scn.nextInt();   
    }while(choice==1); 

    do 
    { 
     total_size=ss.santa.size(); 
     System.out.println(total_size); 
     Collections.shuffle(ss.santa); 
     System.out.println(ss.names.size()); 
     System.out.println("Below is the list of participants with their secret santas"); 
     Iterator<?> itr=ss.names.iterator(); 

     while(itr.hasNext()) 
     { 
      String name=(String)itr.next(); 
      String SecretName; 
      do 
      { 
      int rand=r.nextInt(total_size); 
      SecretName=ss.santa.get(rand); 
      }while(name.equals(SecretName)); 

      System.out.println(name+" "+SecretName); 
      ss.santa.remove(SecretName); 
      total_size=ss.santa.size();  
     } 
     ss.santa.addAll(ss.names); 
     Collections.shuffle(ss.santa); 
     System.out.println("do you want to rerun??"); 
     System.out.println(" 1-YES 2-NO"); 
     choice=scn.nextInt(); 
    }while(choice==1); 

ответ

1

Прежде всего, вы никогда не можете быть уверены, что конфигурация не повторяется. Существует всего 6 перестановок из 3 элементов, поэтому каждый 6-й повтор (статистически) конфигурации повторяется, предполагая, что у вас есть 3 элемента в списке.

Далее, о ваших виселях. Вы удаляете элементы из списка, а затем попросите программу найти там элемент. Представьте себе эту ситуацию: ваши имена - Фред, Эрик, Майк. Возможные варианты:

Fred - Eric 
Eric - Fred 

Итак, вы получаете только Mike в списке и только Майк в списке сант. См. Проблему? Невозможно выбрать Санта. Это можно решить несколькими способами.

Самый простой способ - перетасовать имена, предположить, что они соответствуют индексам и проверяют, является ли кто-то для себя санти. Если да, перестановки. Это все еще имеет указанную проблему, но только для размера списка (в этом случае проблема явно неразрешима).

+0

Мне не нужны разные выходы на каждом прогоне, но только на последовательных прогонах. Я добавил следующий код в то время как (itr.hasNext()) \t \t { \t \t \t Название: String = (строка) itr.next(); \t \t \t \t String SecretName; \t \t \t \t делают \t \t { \t \t \t INT Rand = r.nextInt (TOTAL_SIZE); \t \t \t SecretName = ss.santa.get (rand); \t \t \t \t \t \t} while (name.equals (SecretName) || s.contains (SecretName)); \t \t \t s.add (SecretName); \t \t \t System.out.println (name + "" + SecretName); \t \t \t \t \t } \t \t \t \t s.removeAll (ss.names); – nnm

0

Программа генерирует один и тот же результат на некоторых повторах, так как u использует случайную функцию, и эта функция может создавать повторяющиеся числа (int rand = r.nextInt (total_size);).

Смежные вопросы