1

C ++でこれらの乱数を使用して、しばらくの間髪を引き裂いています。

Pythonでは、私は素晴らしいものを持っていました:

random.uniform(0, 1)

呼び出すたびに新しい乱数を生成しました。

C++には、このようなものが必要です。私は長い間グーグルで検索erand48()し、レイトレーサーに実装する予定の を見つけました(PythonからC ++に翻訳しています)。

簡単なテスト ケースを試してみましたが、random_uniform()常に新しい乱数を吐き出す関数を作成したいと考えていました (これは非常に高速に実行されるため、AFAICT を使用してtime()機能しません) 。

unsigned short Xi[3] = {0, 1, 27};
std::cout << erand48(Xi);

そして、出力は次のとおりです(プログラムを呼び出すたびに出力されます):

0.174529

次のように、前の出力を new として使用してみましたXi( Xis 初期値が定義されました):

float random_uniform() {
  long generated = erand48(Xi);
  int temp = generated * 1000000;

  unsigned short Xi[3] = {temp - 16, temp - 7, temp - 18};

  return generated;
}

しかし、それは十分な乱数を生成するようには見えません(そして、吐き出すだけです.I 0'、理由はわかりません...)。

毎回新しい乱数を吐き出す関数を作成する方法はありますか?

4

4 に答える 4

3

Python に慣れていないので、random.uniform(0, 1) が 0 と 1 の間の一様分布から乱数を吐き出すと仮定しますか?

その場合は、次のことを試してください。

srand(time(NULL));
float myRand = ((float) rand( )) / RAND_MAX;

ただし、走行距離は異なる場合があることに注意してください- rand() は、非常に高品質の乱数ソースであるとは限りません。実装と使用方法によっては、視覚的なアーティファクトが発生する場合があります。raytracer で Mersenne Twister 乱数発生器を使用しています。

編集:もう少し明確にするために、それは次のとおりです。

...
void init_program ( )
{
    ...
    srand(time(NULL));
    ...
}
...
float random_uniform ( )
{
    return ((float) rand( )) / RAND_MAX;
}
...

srand両方を同時に呼び出すとrand、毎回同じ「乱数」を取得する可能性があります。timeその間に が変更されていない限り、ジェネレーターにまったく同じシードをシードするため、正確に同じ最初の乱数。

于 2011-05-06T02:35:41.310 に答える
2

rand()C++ 標準ライブラリの一部である を使用していない理由はありますか? あなたが参照している関数は、Single UNIX Specification の一部ですが、おそらく移植可能ではありません...

同じ値を何度も取得している理由は、乱数ジェネレーターをシードしていないためであり、決定論的に動作します。UNIX 固有の関数に問題がなく、48 ビットの精度が必要な場合は、 srand()orを使用してください。プログラムの最初に一度だけ呼び出して、それを渡します。の使用について心配する必要はありません。この関数を呼び出すのは 1 回だけなので、常に同じ時間値を取得することを心配する必要はありません。srand48()time(NULL)time()

戻り値を取得し、rand()それを必要な範囲に効果的にスケーリングする方法については、このページを参照することもできます。

C または C++ rand() 関数の使用


編集:戻ってドキュメントをerand48もう一度読んでください。[0, 1) の範囲の double を返すことがわかります。それを long に入れているため、おそらく常にゼロが表示されます (値は整数に切り捨てられます)。また、おそらくunsigned longシーケンスの現在の番号で配列の値を更新していると思います-ストレージを提供し、それを使用してシーケンスを「追跡」します。

試す:

unsigned short xsubi[3] = { 0, 1, 27 };
for (int i = 0; i < 10; ++i)
{
   double value = erand48(xsubi);
   printf("%f\n", value);
}
于 2011-05-06T02:39:27.860 に答える
1

ええ、それは と呼ばれstd::rand()、標準で付属し、 で出荷され<cstdlib>ます。

http://msdn.microsoft.com/en-us/library/398ax69y(v=VS.100).aspx

于 2011-05-06T02:34:01.967 に答える
1

Boost.Randomを調べたいと思うかもしれません。

于 2011-05-06T02:47:54.613 に答える