0

すべての参加者の一意のシークレット サンタを出力し、同じ入力で出力を繰り返さないシークレット サンタ プログラムをコーディングしています。

私の問題は次のとおりです。

  1. プログラムは、いくつかの再実行で同じ出力を生成しています...
  2. リストに 3 つ以上の名前が存在する場合、最初の実行後にプログラムがハングします。少数のエントリのみの正しい出力を出力します。たとえば、3 つの名前の場合、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);
4

2 に答える 2

1

まず第一に、構成が繰り返されないという確信は持てません。3 つの要素の順列は 6 つしかないため、リストに 3 つの項目があると仮定すると、(統計的に) 6 回目の再実行ごとに構成が繰り返されます。

次に、ハングについて。リストからアイテムを削除してから、プログラムにそこにある要素を見つけるように依頼します。この状況を想像してみてください。あなたの名前は Fred、Eric、Mike です。選択肢は

Fred - Eric
Eric - Fred

したがって、リストには Mike のみが表示され、サンタのリストには Mike のみが表示されます。問題が見えますか?サンタを選ぶ方法はありません。これはいくつかの方法で解決できます。

最も簡単な方法は、名前をシャッフルし、それらがインデックスによって対応していると仮定し、誰かが自分自身のサンタであるかどうかを確認することです。だったら改造。これにはまだ前述の問題がありますが、リストサイズが 1 の場合のみです (この場合、問題は明らかに解決できません)。

于 2013-08-23T09:54:45.463 に答える
0

u はランダム関数を使用しており、その関数は繰り返し数を生成できるため ( int rand=r.nextInt(total_size); )、プログラムはいくつかの再実行で同じ出力を生成しています。

于 2013-08-23T10:13:38.290 に答える