1. ホーム
  2. objective-c

[解決済み] arc4randomとarc4random_uniformの違いは何ですか?重複

2022-02-16 12:25:45

質問

との違いについて、古い投稿を見たことがあります。 randomarc4random をObjective-Cで使っていて、ネットで回答を見たのですがよくわからなかったので、どなたかここでわかりやすく説明していただけたらと思います。

を使用するのと何が違うのでしょうか? arc4randomarc4random_uniform で乱数を発生させるのですか?

解決方法は?

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

から man 3 arc4random :

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

例えば、0から4までの整数が欲しい場合、以下のようになります。

arc4random() % 5

または

arc4random_uniform(5)

この場合、modulus演算子を使うとmoduloのバイアスがかかるので、arc4random_uniformを使うのがよいでしょう。

モジュロバイアスを理解するために、次のように仮定します。 arc4random はもっと小さな範囲でした。0から(2^32) -1ではなく、0から(2^4) -1です。 この範囲の各数値に対して% 5を実行すると、0が4回、1、2、3、4がそれぞれ3回となり、0の発生確率がより高くなります。この差は、範囲がもっと大きくなるとあまり意味がなくなりますが、それでもモジュラスを使わないほうがよいでしょう。