2010-12-14 18 views
4
int randomNumber = (arc4random() % 83) + 1; 

"最もランダムな"数値を生成する最も良い方法ですか?または乱数を生成するより良い方法はありますか?arc4random乱数生成器

+0

この質問を参照できます:http://stackoverflow.com/questions/3724526/how-to-generate-random-number-from-0-5-to-1-0/3724668#3724668 –

答えて

9

arc4randomは、現在の時刻に基づいて乱数を生成する優れたアルゴリズムを備えています。他のランド機能はありますが、それほど良くなく、播種が必要です。

+3

'arc4random'また、播種が必要になります。 – Joey

+1

は何よりも優れていますか? –

+0

arc4randomと同じくらい幅広い範囲で生成されるランドや同様の関数 – prgmast3r

13

あなたは(randで使用される一般的なアルゴリズムである)線形合同ジェネレータで%を使用してのいずれかの落とし穴を避けるarc4random使用:下位ビットはあまりランダムではありませんが。

(1 << 32) % 83が77であり、0と76の間の数字が77と82の間の数字よりも若干頻繁に表示されることを意味します。これを避けるには、値が(1 << 32)/83 * 83より大きい場合は(つまり、arc4randomと再呼び出ししてください)。

(Iはarc4randomの範囲は0から2 であると仮定-1。従って上記の説明を調整。)

+1

@ジョーブロー:OPは通常利用できる「最良の」乱数生成システムを求めていたので、私はそれに答えていました。また、 'arc4random'は素晴らしいです:それはカーネルで収集されたエントロピーとすべての良いものを使用します。 –

+1

@Joe Blow:実際、 'arc4random'は暗号グレードのランダム性です。これは '/ dev/arandom'からの読み込みと同じです。あなたがランダム性を正しく処理していれば(そして私が言及したチェックをしないで無意識に結果を歪ませないで)、あなたは暗号グレードのものに使うことができます。 –

+0

arc4には数多くのよく知られたバイアスがあります。たとえば、http://www.worldlingo.com/ma/enwiki/en/RC4「RC4によって生成されたキーストリームは、特定のシーケンスに向かって様々な偏りを持っています。このため、科学的に重要なMCシムなどではarc4を使用できません。 – Fattie

2

私が今まで見た中で最高の乱数発生器(同様に非常に明確などのようなランダムな手段の定義)は、スティーブン・ウォルフラムの「新しい科学の種類」で見つけることができます。 Mathematicaのソフトウェアプログラムで数十年の間乱数生成器として非常に簡単なセルオートマトンを使用してきたので、非常によくテストされています。