arc4random() を使用するときに数値の範囲を設定できますか? たとえば、50 ~ 100 のみ。
6 に答える
以下の他の投稿で指摘されているように、 を使用することをお勧めしますarc4random_uniform
。(この回答が最初に書かれたときarc4random_uniform
は、利用できませんでした)。のモジュロ バイアスを回避するだけでなく、短い時間枠で再帰的に使用arc4random() % x
する場合のシードの問題も回避します。arc4random
arc4random_uniform(4)
0、1、2、または 3 を生成します。したがって、次のように使用できます。
arc4random_uniform(51)
結果に 50 を追加するだけで、50 ~ 100 (両端を含む) の範囲が得られます。
JohnK のコメントを拡張します。
次の関数を使用して範囲付き乱数を返すことをお勧めします。
arc4random_uniform(51)
0
からの範囲の乱数を返し50
ます。
次に、下限を次のように追加できます。
arc4random_uniform(51) + 50
50
からの範囲の乱数を返し100
ます。
arc4random_uniform(51)
overを使用する理由は、モジュロ バイアスarc4random() % 51
を回避するためです。これは、man ページで次のように強調表示されています。
arc4random_uniform(upper_bound) は、upper_bound より小さい一様分布の乱数を返します。arc4random_uniform() は ``arc4random() % upper_bound'' のような構造よりも推奨されます。これは、上限が 2 のべき乗ではない場合の「モジュロ バイアス」を回避するためです。
つまり、より均等に分散された乱数が生成されます。
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
randon number
との間10
で生成されます30
。11,12,13,14......29
Swiftでは、これを使用できます(@Justynの回答に触発されました)
func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{
let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) + UInt32(rangeFrom)
return Int(theKey)
}
常にランダムな範囲の整数を提供します。
多くの場合、10 から 30 は包括的を意味します (10 と 30 を含む) ...
int fromNumber = 10;
int toNumber = 30;
toNumber ++;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
toNumber の違いに注意してください - fromNumber は 21 ... (20+1) になり、0 から 20 (含む) の結果が得られ、fromNumber (10) に追加すると 10 から 30 (含む) になります。