Java 如何以随机顺序获取数组中的元素,而无需再次读取同一元素?

Java 如何以随机顺序获取数组中的元素,而无需再次读取同一元素?,java,Java,我被分配了一个任务,用户输入他们想要预订的旅行座位数。之后,我将一组座位设置为false,因为它们是空的。然后,根据用户想要预订的座位数,程序将输出带有座位号的登机牌。登机牌的输出不能有相同的座位号,因为它们要么是空的,要么不是空的 除了下面看到的小片段之外,我的代码工作得很好。正如你所见,我把俱乐部和经济舱的所有座位都设为假的。然后我提示用户输入他们想要预订的座位。我遇到的问题是在代码的底部,因为有5个俱乐部座位,如果我想预订5个俱乐部座位,它应该输出5张带有不同座位号的登机牌。但由于某些原因

我被分配了一个任务,用户输入他们想要预订的旅行座位数。之后,我将一组座位设置为false,因为它们是空的。然后,根据用户想要预订的座位数,程序将输出带有座位号的登机牌。登机牌的输出不能有相同的座位号,因为它们要么是空的,要么不是空的

除了下面看到的小片段之外,我的代码工作得很好。正如你所见,我把俱乐部和经济舱的所有座位都设为假的。然后我提示用户输入他们想要预订的座位。我遇到的问题是在代码的底部,因为有5个俱乐部座位,如果我想预订5个俱乐部座位,它应该输出5张带有不同座位号的登机牌。但由于某些原因,它不会输出所有5个席位,例如,如果我输入我想要5个席位,并且它们都是俱乐部席位,我的程序输出:

Club Pass: Seat 1
Club Pass: Seat 1
Club Pass: Seat 3
Club Pass: Seat 2
Club Pass: Seat 1
我是数组新手,我知道下标从0开始,我想也许我需要从下面的Math.random行中减去1。我知道这个问题很可能与代码的最后一段和Math.Random行有关,但我不确定到底是什么导致了这个错误**

import java.util.Scanner;
public class MyClass
{
public static void main(String args[])
{
    Scanner input = new Scanner (System.in);
    
    System.out.println ("Welcome to the new bullet train from Beefalo Bay Transportation Company.");
    
    System.out.println ("Our new bullet train has 20 seats, 5 club, and 15 economy seats.");
    
    System.out.println ("Would you like to make a booking? If so enter true, if not enter false.");
    
    boolean wantToReserve = input.nextBoolean();
        
        while (wantToReserve == false)
        {
            System.out.println ("You entered false. Would you like to make a reservation?");
        
            wantToReserve = input.nextBoolean();
        
            if (wantToReserve == false)
            {
                System.out.println ("You may close the program.");
            }
        }
    System.out.println ("How many seats would you like to book?");

    System.out.println ("Please note we only have 20 seats, 5 club and 15 economy.");

    System.out.println ("If you would like more than 20 seats, please execute the program multiple times.");

    int numberOfSeats = input.nextInt();
    
        while (numberOfSeats > 20 | numberOfSeats <= 0){
            System.out.println ("You entered a value greater than 20 or less than 0.");

            System.out.println ("You must modify the seats you would like to book, as we only have 20 seats.");

            System.out.println ("If you would like more than 20 seats, please execute the program multiple times.");

            numberOfSeats = input.nextInt();
        }
        
    boolean clubSeating [] = {false, false, false, false, false};
    
    boolean economySeating [] = {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};

    System.out.println ("How many club seats would you like?");

    int numberOfClub = input.nextInt();
    
    System.out.println ("How many economy seats would you like?");
    
    int numberOfEconomy = input.nextInt();

        while (numberOfClub + numberOfEconomy != numberOfSeats || numberOfEconomy > 15 || numberOfClub > 5 || numberOfEconomy < 0 && numberOfClub < 0 ){
            System.out.println ("At least one of the previous inputs were not allowed. Note that we have 5 club and 15 economy seats. Please re-enter.");
        
            System.out.println ("How many club seats would you like?");
        
            numberOfClub = input.nextInt();
        
            System.out.println ("How many economy seats would you like?");
        
            numberOfEconomy = input.nextInt();
        }
        
        
        for (int j = 0; j < numberOfClub ; j++){
        
            int seatForClub1 = (int) (Math.random()*(numberOfClub));
            
            clubSeating [seatForClub1] = true;
            
            int seatForClub = (int) (Math.random()*(numberOfClub));

            if (clubSeating [seatForClub] == false){
                clubSeating [seatForClub] = true;                       
                System.out.println ("Boarding Pass: Seat  " + seatForClub);
            }
                
            if (clubSeating [seatForClub] == true){
                seatForClub = (int) (Math.random()*(numberOfClub)); 
                System.out.println ("Boarding Pass: Seat  " + seatForClub);
            }
        }
    }        
        
}
import java.util.Scanner;
公共类MyClass
{
公共静态void main(字符串参数[])
{
扫描仪输入=新扫描仪(System.in);
System.out.println(“欢迎来到Beefalo Bay运输公司的新子弹头列车”);
System.out.println(“我们新的子弹头列车有20个座位,5个俱乐部和15个经济舱座位。”);
System.out.println(“您想预订吗?如果是,请输入true,如果不是,请输入false”);
布尔wantToReserve=input.nextBoolean();
while(wantToReserve==false)
{
System.out.println(“您输入了false。您想预订吗?”);
wantToReserve=input.nextBoolean();
如果(wantToReserve==假)
{
System.out.println(“您可以关闭程序。”);
}
}
System.out.println(“您想预订多少个座位?”);
System.out.println(“请注意,我们只有20个座位,5个俱乐部和15个经济舱。”);
System.out.println(“如果您想要超过20个座位,请多次执行该程序。”);
int numberOfSeats=input.nextInt();
而(numberOfSeats>20 | numberOfSeats>15 | | numberOfClub>5 | | numberOfEconomy<0&&numberOfClub<0){
System.out.println(“至少一个以前的输入是不允许的。请注意,我们有5个俱乐部和15个经济舱座位。请重新输入。”);
System.out.println(“您想要多少俱乐部席位?”);
numberOfClub=input.nextInt();
System.out.println(“您想要多少经济舱座位?”);
numberOfEconomy=input.nextInt();
}
对于(int j=0;j
关于
Math.Random()
的问题,你是对的。 这只是返回一个随机数,但四舍五入时可能会重复。所以很有可能,当你把这个乘以座位数,你会得到同样的值

例如:一次调用
Math.Random()
可能导致0.8,另一次调用可能导致0.71。这两个数乘以3(俱乐部座位数)都将返回2,因为当您键入int时,小数部分将被删除

所以,如果你绕了三圈,不幸的是你得到了所有的2个座位,那么你只会预订一个座位

一种解决方法是仅在预订座位时增加循环计数器

       for (int j = 0; j < numberOfClub; ) {
            int seatForClub = (int) (Math.random() * (numberOfClub));

            if (clubSeating[seatForClub] == false) {
                clubSeating[seatForClub] = true;
                System.out.println("Boarding Pass: Seat  " + seatForClub);
                j++;
            }
        } 
在Java中,有更好的方法获取随机值。你可以参考这个


您还可以使用Collections.shuffle()生成一个随机列表,并迭代该列表的前n个元素(其中n是本例中的俱乐部席位数)。但是,如果这个特殊练习的目的是让初学者理解算法,并且在没有任何内置函数/集合框架的情况下进行操作,那么这种方法就不适合您。

不一定,问题在于我的程序虽然生成了随机数。我的程序无法识别什么时候它已经生成,或者它是否是新的,不管怎样,我的程序都会打印出来。很抱歉这就是链接问题的地址,请再读一遍。有几个有用的答案可供选择我很抱歉这么说,但这篇文章中的大多数语法对我来说都是非常陌生的。几周前,我刚刚开始学习Java入门课程。我试图理解它,但如果有人能在这种特殊情况下提供帮助,那就太好了,如果我不理解的话。不管怎样,谢谢你推荐我到这篇文章。非常感谢!!我保留了这个答案,只是为了解决随机数生成的问题,但是您也可以稍微整理一下代码。我不明白为什么在t的每次迭代中调用
Math.random()
三次
        int numberOfClubSeatsRemaining = totalNumberOfClubSeats; // initialize to total number of seats 
        
      
        for (int j = 0; numberOfClubSeatsRemaining > 0 && j < numberOfClub; ) {
             int seatForClub = (int) (Math.random() * (numberOfClub));
 
             if (clubSeating[seatForClub] == false) {
                 clubSeating[seatForClub] = true;
                 System.out.println("Boarding Pass: Seat  " + seatForClub);
                 j++;
                 numberOfClubSeatsRemaining--;
             }
         }