int randomNumber = (arc4random() % 83) + 1;
これは「最もランダムな」数を生成するための最良の方法ですか?または、乱数を生成するためのより良い方法はありますか?
int randomNumber = (arc4random() % 83) + 1;
これは「最もランダムな」数を生成するための最良の方法ですか?または、乱数を生成するためのより良い方法はありますか?
を使用すると、線形合同法(で使用される通常のアルゴリズム)arc4random
で使用する際の落とし穴を回避できます。下位ビットはそれほどランダムではありません。%
rand
ただし、まだ切り捨ての問題があります。つまり、(1 << 32) % 83
77であるため、0〜76の数値は77〜82の数値よりも(わずかに)頻繁に表示されます。これを回避するには、着信値を破棄する必要があります(つまり、arc4random
再び)それが上にある場合(1 << 32) / 83 * 83
。
arc4random
(の範囲は0から2 32 -1であると想定しています。それに応じて上記の説明を調整してください。)
arc4randomには、現在の時刻に基づいて乱数を生成するための優れたアルゴリズムがあります。他のランド関数もありますが、それらはそれほど良くなく、シードが必要です。
私が今まで見た中で最高の乱数発生器 (および乱数の意味の非常に明確な定義) は、Stephen Wolfram の A New Kind of Science にあります。彼は Mathematica ソフトウェア プログラムで何十年も乱数発生器として非常に単純なセル オートマトンを使用してきたため、非常によくテストされています。