0

了解しました。arc4randomを使用して配列からランダムな画像を取得しています。このためのコードは次のとおりです。

//ray is the array that stores my images
int pic = arc4random() % ray.count; 
tileImageView.image = [ray objectAtIndex:pic-1];
NSLog(@"Index of used image: %d", pic-1);

私はこのコードを複数回呼び出しており、しばらくは機能しますが、しばらくすると、このエラーのために常にクラッシュします。

 *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** - [__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 39]'

私の質問は、なぜこの途方もなく大きな数が作成されたのかということです。arc4random関数に何か問題がありますか?どんな助けでも大歓迎です

4

3 に答える 3

2

このarc4random_uniform(upper_bound)関数を使用して、範囲内の乱数を生成することもできます。以下は、0から73までの数値を生成します。

arc4random_uniform(74)

arc4random_uniform(upper_bound)は、マニュアルページで説明されているようにモジュロバイアスを回避します。

arc4random_uniform() will return a uniformly distributed random number less than upper_bound. arc4random_uniform() is recommended over constructions like ``arc4random() % upper_bound'' as it avoids "modulo bias" when the upper bound is not a power of two.
于 2011-10-15T23:15:42.143 に答える
0

arc4randomは、ray.countの0または偶数の倍数を返します。したがって、ray.countで変更すると、0が得られます。次に、これから1を引くと、-1が得られます。これは、非常に大きな符号なし整数に変換されます。

于 2011-10-15T23:04:34.433 に答える
0

問題は、pic-1構造がたまに-1を生成するためです(これは、署名されていない形式では4294967295です)。pic-1を削除し、代わりにpicを使用する必要があります。

于 2011-10-15T23:10:21.363 に答える