web-dev-qa-db-ja.com

arc4randomとarc4random_uniformの違いは何ですか?

Objective-Cでrandomarc4randomの違いに関する古い投稿を見て、このオンラインでの回答を見ましたが、本当に理解していなかったので、ここに誰かを期待していましたわかりやすい方法で説明できます。

arc4randomarc4random_uniformを使用して乱数を生成することの違いは何ですか?

42
Brennan Adler

arc4randomは0から(2 ^ 32)-1までの整数を返し、arc4random_uniformは0から渡された上限までの整数を返します。

man 3 arc4randomから:

arc4random_uniform()は、upper_boundより小さい均一に分布した乱数を返します。 arc4random_uniform()は、上限が2のべき乗でないときに「モジュロバイアス」を回避するため、「arc4random()%upper_bound」のような構造よりも推奨されます。

たとえば、0〜4の整数が必要な場合は、次を使用できます。

arc4random() % 5

または

arc4random_uniform(5)

この場合にモジュラス演算子を使用すると、モジュロバイアスが導入されるため、arc4random_uniformを使用することをお勧めします。

モジュロバイアスを理解するには、arc4randomの範囲がはるかに狭いと仮定します。 0〜(2 ^ 32)-1の代わりに、0〜(2 ^ 4)-1でした。その範囲内の各数値で%5を実行すると、0が4回、1、2、3、4が3回それぞれ取得され、0が発生する可能性が高くなります。範囲がはるかに大きい場合、この差はそれほど重要ではなくなりますが、モジュラスの使用は避ける方が良いでしょう。

89
Connor