2012-05-02 30 views
3

私はコンソールから次のような出力を得ることから-5 6.なぜarc4randomが奇妙な値を返すのですか?

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

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

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()にはシーディングが必要です。

+1

「num」の宣言を表示できますか?おそらく、おそらく 'unsigned int'でしょうか? :) – nacho4d

+1

私はnumが符号なし整数だと思いますか? – lnafziger

+1

申し訳ありませんが、私はnumの宣言を含めました。 –

答えて

7

arc4random()u_int32_tを返します - それは、符号なし整数、負の値を表すものではありません一つです。 arc4random() % 11は、0≤n≤n < 5となるたびに5を引いて、非常に大きな数値にラップアラウンドします。

doubles は負の数を表しますが、それは遅すぎるまでdoubleには変換されません。そこにキャストをつける:

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

減算の前にモジュロの結果を昇進させると、すべてが問題ありません。

+0

ありがとう!それは理にかなっている。 'arc4random()'は符号なし整数を返します。これは減算でオーバーフローする可能性があります。 –

4

ではなく

arc4random_uniform(11) - 5; 

を使用してみてください。 manページから

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. 
+0

ありがとう、 "モジュロバイアス"とは何ですか? –

+0

@ジャスティンケース:乱数ジェネレータが1から5の数字だけを生成したとします。もしあなたが 'rand()%2'を持っていたら、0より1を得る可能性が高くなります。明らかに 'arc4_random()%upper_bound'(' upper_bound'は2の累乗ではありません)のバイアスは私の例ほど巨大ではありませんが、依然として存在します。 – dreamlax

+0

このページにも例があります - http://romhack.wikia.com/wiki/Random_number_generator – danielbeard

関連する問題