41

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

4

6 に答える 6

73

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

arc4random_uniform(4)

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

arc4random_uniform(51)

結果に 50 を追加するだけで、50 ~ 100 (両端を含む) の範囲が得られます。

于 2010-08-06T03:16:04.517 に答える
27

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 のべき乗ではない場合の「モジュロ バイアス」を回避するためです。

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

于 2013-12-18T23:20:40.203 に答える
18
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

randon numberとの間10で生成されます3011,12,13,14......29

于 2010-09-16T08:30:35.097 に答える
1

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

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

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

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

于 2015-12-20T16:09:26.133 に答える
0

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

于 2013-05-04T01:14:47.777 に答える