1

私は持っている

for (int i = 0; i< 10; i++) {
    CGFloat longerA = ((arc4random() % 80) - 40) / 100.0f;
    NSLog(@"%f",longerA);
}

結果は

2013-09-20 11:41:30.801 ****[7025:a0b] 0.390000
2013-09-20 11:41:30.801 ****[7025:a0b] 0.080000
2013-09-20 11:41:30.801 ****[7025:a0b] 0.380000
2013-09-20 11:41:30.801 ****[7025:a0b] 42949672.000000
2013-09-20 11:41:30.802 ****[7025:a0b] 0.060000
2013-09-20 11:41:30.802 ****[7025:a0b] 0.080000
2013-09-20 11:41:30.802 ****[7025:a0b] 0.290000
2013-09-20 11:41:30.802 ****[7025:a0b] 42949672.000000
2013-09-20 11:41:30.803 ****[7025:a0b] 0.350000
2013-09-20 11:41:30.803 ****[7025:a0b] 0.180000

なぜ結果が42949672.000000なのか理解できません

なぜこれが起こっているのか説明してください

私が「理解している」ように、ランダム(80)-40と結果/ 100.0fが必要なので、これ(arc4random()%80)が79を超える方法がわかりません。

4

2 に答える 2

2

arc4random符号なし整数を返します。これは 0 未満にはなりません。40 を減算するとアンダーフローし、最大値に近い値にラップします。

また、関数にはモジュロ バイアスがあります (一部の値は他の値よりも一般的です)。arc4random_uniform(80)を行う代わりに を使用して、これを修正し% 80ます。したがって、正しい解決策は次のとおりです。

for (int i = 0; i< 10; i++) {
    CGFloat longerA = (((int)arc4random_uniform(80)) - 40) / 100.0f;
    NSLog(@"%f",longerA);
}
于 2013-09-20T09:11:23.110 に答える