int randomNumber = (arc4random() % 83) + 1;
"最もランダムな"数値を生成する最も良い方法ですか?または乱数を生成するより良い方法はありますか?arc4random乱数生成器
int randomNumber = (arc4random() % 83) + 1;
"最もランダムな"数値を生成する最も良い方法ですか?または乱数を生成するより良い方法はありますか?arc4random乱数生成器
あなたは(rand
で使用される一般的なアルゴリズムである)線形合同ジェネレータで%
を使用してのいずれかの落とし穴を避けるarc4random
使用:下位ビットはあまりランダムではありませんが。
(1 << 32) % 83
が77であり、0と76の間の数字が77と82の間の数字よりも若干頻繁に表示されることを意味します。これを避けるには、値が(1 << 32)/83 * 83
より大きい場合は(つまり、arc4random
と再呼び出ししてください)。
(Iはarc4random
の範囲は0から2 であると仮定-1。従って上記の説明を調整。)
@ジョーブロー:OPは通常利用できる「最良の」乱数生成システムを求めていたので、私はそれに答えていました。また、 'arc4random'は素晴らしいです:それはカーネルで収集されたエントロピーとすべての良いものを使用します。 –
@Joe Blow:実際、 'arc4random'は暗号グレードのランダム性です。これは '/ dev/arandom'からの読み込みと同じです。あなたがランダム性を正しく処理していれば(そして私が言及したチェックをしないで無意識に結果を歪ませないで)、あなたは暗号グレードのものに使うことができます。 –
arc4には数多くのよく知られたバイアスがあります。たとえば、http://www.worldlingo.com/ma/enwiki/en/RC4「RC4によって生成されたキーストリームは、特定のシーケンスに向かって様々な偏りを持っています。このため、科学的に重要なMCシムなどではarc4を使用できません。 – Fattie
私が今まで見た中で最高の乱数発生器(同様に非常に明確などのようなランダムな手段の定義)は、スティーブン・ウォルフラムの「新しい科学の種類」で見つけることができます。 Mathematicaのソフトウェアプログラムで数十年の間乱数生成器として非常に簡単なセルオートマトンを使用してきたので、非常によくテストされています。
この質問を参照できます:http://stackoverflow.com/questions/3724526/how-to-generate-random-number-from-0-5-to-1-0/3724668#3724668 –