6

笑

上記は、rand()を使用してランダムな座標を取得し、それらの座標のピクセル値に定数を追加することによって生成された画像の例です。これは、数千回の反復からどのように見えるかです。Mac OS X Lionでstdlib.hのrand()を使用しており、シードとしてtime(NULL)を指定しています。

奇数のx座標を持つものは、偶数のx座標を持つものよりも高い値を持っているかのように、垂直線をはっきりと見ることができます。

より良いアルゴリズムを実装するにはどうすればよいですか、または依存関係があまりないアルゴリズムをどこで見つけることができますか?(私はヘッダーのみのファイルを好みます)。

コードは次のとおりです(申し訳ありませんが、時間がかかりました):

void generate(int iterations = 1) {
 for (unsigned int x = 0;x < (area * 4);++x) {
  map[rand() % area] += 1;
 }
 number a = min();
 number b = max();
 for (int i = 0;i < area;++i) {
  map[i] -= a;
  map[i] /= b;
 }
}

マップにはダブルフロートが含まれており、後でRGB値に変換されます。

4

4 に答える 4

4

C ++ 11は、非常に便利な乱数機能をrandomで提供します。詳細については、ここここを参照してください。

于 2012-05-21T20:51:28.677 に答える
3

試しましたarc4random()か?よりもはるかに強力で均一なランダム値を提供しますrand()

SecRandomCopyBytes()Security.framework の一部である を試すこともできます。これは基本的に /dev/random から読み取るだけです。

于 2012-05-21T20:49:44.340 に答える
3

rand()座標を抽出するためにどのように使用するかを確認することが最も重要だと思います。本当に驚くべきことは、x 座標のみにパターンが見られ、y 座標には見られないことです。本当に不足しrand()ていた場合は、両方に表示されるはずです。

とはいえ、これらのパターンがどこから来たのかを推測することはできます:rand()は、下位ビットよりも上位ビットでより多くのランダム性を生成することがよく知られています。したがって、より小さな範囲を抽出するためにモジュロを使用しないでください。この方法では、ランダム性の低い低ビット部分のみが取得されるためです。

この知識から、下位ビットを抽出して x 値を生成し、上位ビットを抽出して y 値を抽出していると推測できます。これにより、x 軸よりも y 軸に沿ってはるかにランダムなパターンが得られます。

これが現在行っていることである場合、コードにはまだいくつかのアーティファクトが存在する必要があり、これにより、x 軸に沿ったものよりも y 軸に沿ったランダム性が大きくなります。したがって、コードを見なければ、この実装に欠陥があるかどうかを判断するのは困難です。

于 2012-05-21T20:59:13.527 に答える
1

Mac では、rand の代わりに random を使用できます。のマニュアルページにrandomは、次の注意事項があります。

バグ

rand(3) の約 2/3 の速度。

歴史的な実装では、非常に弱いシードが使用されていました。ランダム シーケンスは、シードによってあまり変化しませんでした。現在の実装では、初期状態の計算に、より優れた疑似乱数ジェネレーターが採用されています。

暗号品質のランダム性を必要とするアプリケーションでは、arc4random(3) を使用する必要があります。

于 2012-05-21T20:59:13.057 に答える