Java 每次输出不同的随机数

Java 每次输出不同的随机数,java,random,unique,Java,Random,Unique,我正在编写一个秘密圣诞老人程序,它打印出所有参与者的唯一秘密圣诞老人,并且不会在相同的输入上重复输出 我的问题是: 程序在某些重新运行时生成相同的输出 如果列表中的名称超过或等于3个,则程序在首次运行后挂起。它只打印少数条目的正确输出。例如,对于3个名字,它打印2个名字的秘密圣诞老人并挂起 代码如下 SecretSanta ss=new SecretSanta(); Scanner scn=new Scanner(System.in); do {

我正在编写一个秘密圣诞老人程序,它打印出所有参与者的唯一秘密圣诞老人,并且不会在相同的输入上重复输出

我的问题是:

  • 程序在某些重新运行时生成相同的输出
  • 如果列表中的名称超过或等于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);
    
    SecretSanta ss=新SecretSanta();
    扫描仪scn=新扫描仪(System.in);
    做
    {
    System.out.println(“添加参与者名称:-”);
    字符串名称=scn.next().trim();
    ss.名称。添加(名称);
    ss.santa.添加(姓名);
    System.out.println(“您想添加更多名称吗?”);
    系统输出打印项次(“1-是2-否”);
    choice=scn.nextInt();
    }while(choice==1);
    做
    {
    total_size=ss.santa.size();
    系统输出打印项次(总尺寸);
    收藏。洗牌(圣诞老人党卫军);
    System.out.println(ss.names.size());
    System.out.println(“下面是带着秘密圣诞老人的参与者名单”);
    迭代器itr=ss.names.Iterator();
    while(itr.hasNext())
    {
    字符串名称=(字符串)itr.next();
    字符串SecretName;
    做
    {
    int rand=r.nextInt(总尺寸);
    SecretName=ss.santa.get(兰德);
    }而(name.equals(SecretName));
    System.out.println(name+“”+SecretName);
    圣塔移除(秘密名称);
    total_size=ss.santa.size();
    }
    圣塔·阿道尔党卫军(党卫军名称);
    收藏。洗牌(圣诞老人党卫军);
    System.out.println(“您想重新运行吗?”);
    系统输出打印项次(“1-是2-否”);
    choice=scn.nextInt();
    }while(choice==1);
    
    首先,您永远无法确保配置不会重复。3个元素只有6个排列,因此每第6次重新运行(统计)配置都会重复,假设列表中有3个项目

    接下来,关于你的绞刑。您正在从列表中删除项目,然后要求程序在其中查找元素。想象一下这种情况:你的名字是弗雷德,埃里克,迈克。选择是

    Fred - Eric
    Eric - Fred
    
    所以名单上只有迈克,圣诞老人名单上只有迈克。看到问题了吗?没有办法选择圣诞老人。这可以通过几种方式解决


    最简单的方法是洗牌名称,假设它们通过索引对应,然后检查是否有人是圣诞老人。如果是的话,重新洗牌。这仍然存在上述问题,但仅针对列表大小1(在这种情况下,问题显然无法解决)。

    程序在某些重新运行时生成相同的输出,因为您使用的是随机函数,该函数可以生成重复数(int rand=r.nextInt(total_size);).

    我不希望每次运行都有不同的输出,只希望连续运行时有不同的输出。我在(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)| s.contains(SecretName));s.add(SecretName);System.out.println(name+“”+SecretName);}s.removall时添加了以下代码(ss.姓名);