2012-08-25 7 views
5

私が開発しているものの一部は、ランダムな会社名ジェネレータです。いくつかの名前部分の配列から描画されます。私はrand()関数を使用して、ランダムな名前の部分を描画します。しかし、いつも同じランダムな数字が常に同じシーケンスで生成されます。私はアプリを起動するので、常に同じ名前が表示されます。Objective-Cではrand()関数をどのようにシードしますか?

私はSOを検索しました.Cではsrand()という機能があり、ランダムな関数をランダムにするために現在の時間のようなものを "シード"しています - srand(time(NULL))のように。 Objective-CのiOS開発用に使えるものはありますか?

答えて

8

関数rand()およびsrand()は、標準Cライブラリの一部であり、Objective-Cを使用したiOS開発では、完全に利用可能なCライブラリの他の部分と同様です。これらのルーチンは、random()srandom()に置き換えられました。これらのルーチンは、ほぼ同一の呼び出し規約をrand()srand()に持っていますが、より長い期間でより良い結果が得られます。乱数装置を使用して乱数発生器の状態を初期化するsrandomdev()ルーチンもあります。これらは標準Cライブラリの一部でもあり、Objective-CのiOSで使用できます。

29

arc4randomに種を必要としないのはなぜですか?

int r = arc4random(); 

Here'srand()にそれを比較する記事:あなたはこのようにそれを使用しています。 arc4random() manページがrand()と比較して、それについての本を書かれています:

arc4random()関数は、8 * 8 8 ビットS-ボックスを使用していますARC4暗号で使用されるキーストリームジェネレータを使用しています。 Sボックスは、約(2 1700)の状態になります。 arc4random()関数は、0から(2 32)-1の範囲の擬似 乱数を返します。したがって、は、rand(3)と random(3)の2倍の範囲です。

範囲内の乱数を使用する場合は、arc4random_uniform()関数を使用できます。例えば、0と10の間の乱数を生成するために、あなたはこれを行うだろう。ここでは

int i = arc4random_uniform(11); 

は、manページからいくつかの情報です:

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

+2

技術的には@ torrey.lyonsが私の質問に直接答えましたが、私は間違いなくsrand()よりもarc4randomを好んでいました。ありがとう – inorganik

関連する問題