3

-5 から 6 までのランダムな値を生成するために、iOS アプリケーションの関数で arc4random を呼び出しています。

double num;
for (int i = 0; i < 3; i++) {
    num = (arc4random() % 11) - 5;
    NSLog(@"%0.0f", num);
}

コンソールから次の出力が得られます。

2012-05-01 20:25:41.120 Project32[8331:fb03] 0
2012-05-01 20:25:41.121 Project32[8331:fb03] 1
2012-05-01 20:25:41.122 Project32[8331:fb03] 4294967295

0 と 1 は範囲内の値ですが、4294967295 はどこから来たのですか?

に変更arc4random()するrand()と問題は解決しますがrand()、もちろんシードが必要です。

4

2 に答える 2

7

arc4random()u_int32_t-- 負の値を表さない符号なし整数を返します。arc4random() % 110 ≤ n < 5 の数値を思いつくたびに、5 を減算して非常に大きな数値にラップします。

doubleもちろん、sは負の数を表すことができdoubleますが、手遅れになるまで変換しません。そこにキャストを貼り付けます:

 num = (double)(arc4random() % 11) - 5;

減算の前にモジュロの結果を促進するため、すべて問題ありません。

于 2012-05-02T00:48:22.483 に答える
4

使ってみて

arc4random_uniform(11) - 5;

代わりは。

マニュアルページから:

arc4random_uniform() will return a uniformly distributed random number
 less than upper_bound.  arc4random_uniform() is recommended over con-
 structions like ``arc4random() % upper_bound'' as it avoids "modulo bias"
 when the upper bound is not a power of two.
于 2012-05-02T00:32:40.797 に答える