3

私は iOS と Android 用に書いているアプリを持っています。起動時に、1 から 6 までの乱数を取得しようとしています。

iOS (Objective-C):

int random = rand() % (6 - 1) + 1;

アンドロイド (Java):

Random random = new Random();
int num = random.nextInt(6)+1;

どちらの場合も、毎回 3 を返します。

私が読んだ他の質問から、人々はランダムをループして Random オブジェクトを再インスタンス化し続けているため、同じ問題を抱えています。しかし、乱数が 1 つだけ必要なので、インスタンス化するのは 1 回だけです。

では、これらのコードのいずれかを取得して、3 ではなく 1 から 6 の数字を取得するにはどうすればよいでしょうか?

4

5 に答える 5

4

Objective-C の部分については、次のようにランダムにシードする必要があると言えます。

srand(time(0)); // seed it using the current time

Java 部分の場合、new Random()コンストラクターはデスクトップ アプリケーションのデフォルト JVM に自動的にシードしますが、 Android にはシードしません。Android では、デフォルトのシード値を使用します。

Random rand = new Random(System.nanoTime());
于 2012-10-16T19:41:13.700 に答える
3

Objective-C では、arc4random()シードする必要のない推奨関数を代わりに使用できます。次のように使用します。

int random = (arc4random() % 5) + 1;

この関数の大きな利点はrand()、 の範囲が の 2 倍であるrand()ため、「よりランダムな」数値を使用できることです。

于 2012-10-16T20:43:11.543 に答える
2

Android の Random についてはわかりませんが、それ以外の場合は、Random インスタンスにシステム時間などのかなり固有のものをシードする必要があるでしょう。

Random r = new Random(System.currentTimeMillis());

于 2012-10-16T19:40:32.303 に答える
0

私は Java 部分を試してみましたが、私にとっては問題なく動作しますが、時間をシードとして使用して Random をインスタンス化することができます。

    java.util.Date d = new java.util.Date();
    Random random = new Random(d.getTime());
    int num = random.nextInt(6)+1;
    System.out.println(num);
于 2012-10-16T19:41:22.363 に答える