私が達成しようとしていることを述べることから始めましょう。
- 範囲内で一連の数値をランダムに生成する必要があります
- それらの数がある程度均一に分布することを望みます
- シードが与えられた場合、結果の乱数が常に同じになるように、乱数生成をシードできる必要があります。
drand48()、rand()、arc4random() をかなり試した後、現在、乱数を取得するために rand() を使用し、シードするために srand() を使用することに落ち着きました。これは私がやっていることから単純化された小さな例です:
let seed: UInt32 = 10
srand(seed)
let start = 0
let end = 100
let randomNumber = Double(rand()) % (end + 1 - start) + start
これは機能します。同じシードが与えられれば、同じ乱数が出てきます。複数の randomNumber 計算を実行すると、複数の異なる乱数が出てきます。srand を介して再シードすると、「ランダム性」が再び開始されます。
唯一の欠点は、rand() が均一に分散されていないことです。実際、ほとんどの場合、ほとんどの場合、直線的に増加する一連の数値になります。
arc4random_uniform はより多くの均一なランダム出力を生成するように思えますが、私の調査では、arc4random をシードすることはできません。これは、arc4random が最初に呼び出されたときにシードされ、外部からシードされるように必ずしも「設計」されているとは限らないためです。
私の質問です。特定のシードに対して同じ出力が得られる srand() / rand() のより良い代替手段はありますが、それらの出力はより均一に分散されていますか?
ありがとう - アダム