0

1〜4の数値をランダムに取得し、それをarrayListに格納する必要があります。良いスタートを切ったのですが、エミュレータがクラッシュし続けるため、無限ループになる可能性があります。番号を複数回使用することもできません。

** lightSelector is a global variable (int lightSelector = 1;)
** generatedOrder is my ArrayList

for (int i = 0; i < 4; i++)
{
        lightSelector = 1 + (int)(Math.random() * 4);           
        generatedOrder.add(lightSelector);
        boolean contains = true;
        System.out.print(generatedOrder.get(i));
        if (!generatedOrder.isEmpty())
        {
            // Loop until a number is generated that hasn't already been picked
            while (contains) 
            {
                if (generatedOrder.contains(lightSelector))
                    lightSelector = 1 + (int)(Math.random() * 4);
                else
                {
                    generatedOrder.add(lightSelector);
                    contains = false;
                    break;
                }       
            }
        }
    }
4

1 に答える 1

2

ランダムにソートされた順序で4つの数値を取得するより効率的な方法は、次のアルゴリズムを実行することです。

1){1、2、3、4}などのint[]配列を作成します。

2)i=0の場合; i <array.length; ++ i、iとarray.length -1の間に乱数jを生成し、iとjを交換します。

重要:つまり、可能なスワップは、00,01,02,03のいずれか、11,12,13のいずれか、22,23のいずれか、33のいずれかです。これにより、すべての4 * 3 *2*が得られます。 1 = 4!配列を並べ替える方法。これは、アルゴリズムが正しいために必要です。

(たとえば、アルゴリズムを完了するための4 ^ 4 = 256の可能な方法がある場合、24は256に均等に入らないため、一部のシャッフルは他のシャッフルよりも表示される可能性が高くなります。)

このシャッフルアルゴリズムの名前は次のとおりです。Fisher-YatesShuffle

編集:整数範囲の乱数を生成する良い方法は、次のことを行うことです。

1)生成Random rng = new Random(); 一度だけ。2つのランダムインスタンスを同時に作成すると、まったく同じ乱数ストリームが生成されるため、新しいインスタンスを作成しないでください。

2)Randomには、nextInt(n)0からn -1までのランダムなintを返すメソッドがあるため、iからjまでの乱数を取得するにはdoを使用しますnextInt(j+1-i)+i。iとjの間で、jを除く乱数を取得するには、を実行しますnextInt(j-i)+i

APIリファレンス:http ://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html

于 2013-03-25T03:52:16.923 に答える