2011-02-05 11 views
3

私はarc4random()がランダム性のための最良のオプションの1つであると考えています。しかし、それは明らかな重複と繰り返しをいくつかの時点で与える傾向があります。iPhoneまたはiPadで高品質の乱数を取得する方法は?

私は、arc4randomの出力に実際のランダム性を追加するために加速度計を使用することを考えました。私はより良い解決策を開発するのに数週間を費やしています。

+0

何をしても、2つの乱数を加算して「よりランダムな」乱数を生成するなどの間違いをしないでください!あなたがしているのは、配布を変更することだけです。 – Fattie

+0

ここではスタックオーバーフローに関する最も有名な答えの1つが説明されています**グラフでも**! http://stackoverflow.com/questions/3956478/understanding-randomness – Fattie

+0

私の悪い; xorの考え方 - 結果のランダム性は実際には変わりません。 – Joey

答えて

4

を乱数「がよりランダム」にしようとしてについて間違っているすべてのものをまとめているので、

に見えます
mersenne twister 

これは、ある意味では「より良い」ものです。それが役に立てば幸い!


私もさえグラフで、うまく分布を説明するスタックオーバーフロー、上の最も有名な答えの1を読み取るためのトピックに新しいです誰を促します!

Understanding "randomness"

は決して、これまでに 『より良い』ランダム性を得るための試みで乱数を追加したり、乗算、」短いバージョンです。

6

数値のランダムなストリームから重複と繰り返しが予想されます。 「より多くのランダム性」を追加しようとする必要はありません。 arc4randomは既にシステムのさまざまなソースからエントロピーを収集する/ dev/urandomから読み込みます。

+0

また、繰返しや重複は、サイコロのような非常に小さなセットからしか数値を描画しないアプリケーションで起こりやすいことにも注意してください。もし彼が 'arc4random()'の実際の出力を見れば、繰り返しや重複は見られないでしょう。 – Joey

+0

@Joey: 'arc4random()'は32ビットの値を出力するので、およそ65000の出力が生成された後にリピートすると予想されます。それは "ありそう"なのだろうか? –

+0

GregS:出力ワードサイズが状態サイズと等しくないため、シーケンスの繰り返しは非常にまれです(iirc arc4randomの周期は2^310)。32ビット出力サイズは65kではなく400万を意味します。 – Joey

5

重複と反復を取り除こうとしている場合(特に、長さが数百万未満のarc4randomシーケンスから)は、おそらくランダムシーケンスがずっと少なくなります。真のランダム性が少ない反復を期待するのは、一般的な人間の精神的なエラーです。

いくつかの目的のために重複したくない場合は、カードシャッフルのように重複要素のないランダムな並べ替えを行う必要があります。

0

私はここで長い答えがありましたが、私はこれにリンクします。それは基本的にあなたがarc4random()よりも良い何かをしたい場合は、あなたの実際の質問に

http://thedailywtf.com/Articles/More-Entropy,-Please.aspx

答えて
+0

あなたは記事が**完全に間違っていることを認識しています**? – Fattie

+0

Joe:TDWTFは*良い*コードやプラクティスを表示していないと思いますか? ;-) – Joey

+0

誰もがすでに知っていたと仮定してはいけませんでした::/ – lxt

2

リストを「見た目に」ランダムに繰り返し、項目を繰り返さないようにするには... arc4random()を使用し、各項目を表示した後にリストから削除します。リストが乾いたら、再度ロードしてください。

例:

if (!self.dictionaryValues) { 
[self loadList]; 

}他{

NSMutableDictionary *unusedValueList = [[NSMutableDictionary alloc] initWithDictionary:self.dictionaryValues]; 

int random = arc4random()%[self.dictionaryValues count]; // note, crashes on nil; 
int i=0; 
for (NSString *key in self.dictionaryValues) { 
     i++; 
     if (i == random) { 
      NSLog(@"MATCH! on key=%@", key); 
      [unusedValueList removeObjectForKey:key]; 
     } 
} 
self.dictionaryValues = nil; 
self.dictionaryValues = unusedValueList; 

}

は、このことができます願っています!

関連する問題