0

これは、配列内の要素をランダムに選択する方法で使用しているものですが、なぜ機能しないのかわかりません。あらゆる方法で書いてみたような気がします。

public static Seat BookSeat(Seat[][] x){

  Seat[][] book = new Seat[12][23];

    if (x != null){  

      book = x[(Math.random()*x.length)];  

    }

  return book;    
}
4

3 に答える 3

1

あなたが物事を説明する方法は、いくつかの概念がどういうわけか交差したと私に思わせます. book は、ランダムに選択したい Seat オブジェクトの (2 次元の) 配列であると想定しています。そのためには、配列の各次元に対してランダムな選択を指定する必要があります。

// this should be declared elsewhere because if it's local to bookSeat it will be lost
// and reinitialized upon each call to bookSeat
Seat[][] book = new Seat[12][23];

// and this is how, after previous declaration, the function will be called
Seat theBookedSeat = bookSeat(book);

// Okay, now we have selected a random seat, mark it as booked, assuming Seat has a 
// method called book:
theBookedSeat.book();


// and this is the modified function.  Note also that function in Java by convention
// start with a lowercase letter.
public static Seat bookSeat(Seat[][] x){
    if (x != null){  
        // using Random as shown by chm052
        Random r = new Random();
        // need to pick a random one in each dimension
        book = x[r.nextInt(x.length)][r.nextInt(x[0].length)];  
    }
    return book;  
}

また、選択した座席がすでに予約されているかどうかを確認し、選択を繰り返すテストを統合する必要があります。

        do {
            // need to pick a random one in each dimension
            book = x[r.nextInt(x.length)][r.nextInt(x[0].length)];
        while (book.isBooked()); // assuming a getter for a boolean indicating
                                 // whether the seat is booked or not

しかし、このような完全ランダム選択にはいくつかの欠点があります。

  1. 選択はランダムであるため、すでに予約されている座席に繰り返し落ちる可能性があり、発生する可能性は、すでに予約されている座席の数とともに増加します。しかし、予約済みの座席がほとんどない場合でも、運が悪く、予約されていない座席に到達する前に、ループが何十回も回転するのを見ることができます。
  2. ループに入る前に未予約の座席がまだ残っているかどうか、または無限に回転するかどうかを絶対にテストする必要があります。

したがって、行と座席をランダムに選択し、そこから最初の空席が見つかるまで検索を開始するなど、よりスマートな選択ルーチンを実装することをお勧めしますが、最初のステップではこれで問題ありません。

これがあなたが達成したかったことを願っています。そうでない場合は、お気軽にコメントして、修正して適応させてください.

于 2012-10-28T23:31:09.733 に答える
0

式によって返される数を床にし(Math.random()*x.length)ます。

Math.floor(Math.random()*x.length);

現時点では、配列に浮動小数点数を添字付けしようとしています。

于 2012-10-28T23:21:26.327 に答える
0

他の答えは完全に機能しますが、すべての計算を行う必要がない場合は、Random.nextInt()を使用してそれを行う別の方法を次に示します。

Random r = new Random();
book = x[r.nextInt(x.length)]; 

java.util.Randomを使用するため、これを行う場合は必ずインポートしてください。

于 2012-10-28T23:24:13.460 に答える