web-dev-qa-db-ja.com

arc4random()を使用するときに値の範囲を選択する方法

Arc4random()を使用するときに数値の範囲を設定できますか?たとえば、50-100のみ。

39
NextRev

以下の他の投稿で指摘されているように、_arc4random_uniform_を使用することをお勧めします。 (この回答が最初に書かれたとき、_arc4random_uniform_は利用できませんでした)。 arc4random() % xのモジュロバイアスを回避することに加えて、短い時間枠で再帰的に使用した場合の_arc4random_のシード問題も回避します。

_arc4random_uniform(4)
_

0、1、2、または3を生成します。したがって、次を使用できます。

_arc4random_uniform(51)
_

結果に50を追加するだけで、50〜100の範囲(包括的)になります。

69
RunLoop

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()は、上限が2のべき乗でない場合に「モジュロバイアス」を回避するため、「arc4random()%upper_bound」のような構造よりも推奨されます。

つまり、より均等に分布した乱数が生成されます。

27
Justyn
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

randon number10の間の30、つまり11,12,13,14......29を生成します

18
Vaibhav Saran

このコードを使用して、範囲を持つランダムな値を生成できます。

//range from 50 to 100
int num1 = (arc4random() % 50) + 50; or
int num1 = arc4random_uniform(50) + 50;

//range from 0-100
int num1 = arc4random() % 100; or
int num1 = arc4random_uniform(100);
3
handiansom

Swiftこれを使用できます( @ Justyn の回答に触発されて)

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) +  UInt32(rangeFrom)
    return Int(theKey)
}

常にランダムな範囲の整数を提供します。

1
kurtanamo

多くの場合、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(両端を含む)になります。

0
Mike Young