2017-10-14 8 views
3

x軸と曲線y = sin(x)+2(例えば)の間に50のランダムな点を選びたいと思います。ランダムな点をこの2D領域に均一に広げたいと思っています。C++の曲線下の2Dランダム点

using namespace std; 
double randnum (double aa, double bb) //defining a function to create random numbers 
{ 
    static std::default_random_engine generator; 
    std::uniform_real_distribution<double> distribution (aa,bb); 
    return distribution(generator); 
} 
    for(int i = 0; i < 50; i++) 
      { 
      x[i] = randnum(0,2 * M_PIl); 
      y[i] = randnum(0,sin(x[i])+2); 
      } 

をしかし、それは曲線がx軸に近い地域で密度の高いポイントを与えるので、それは正しくありません:私はこのようでした。ドメイン内で等密度のポイントを選択するにはどうすればよいですか?

+0

一様に広がるのはどういう意味ですか?その後、彼らはもうランダムではありません! – farbiondriven

+0

私は曲線がx_axisに近い領域では、必要な点数が少なくて済むことを意味します。私は意味がありますか? @farbiondriven –

+0

@ farbiondriven私は彼が一様にサンプリングされたことを意味すると思います。ある点のある点の確率はその領域の面積に比例します – WorldSEnder

答えて

2

関数の下部の下に同じ数/確率のポイントを絞り込まないでください。
代わりに、x-rangeの矩形領域内のランダムな点を最大yにします。
しかし、y軸上で大きすぎるものは無視してください。

I.e.ループを次のように置き換えてください:

for(int i = 0; i < 50; i++) 
{ 
    do 
    { x[i] = randnum(0,2 * M_PIl); 
     y[i] = randnum(0,3); // three is max-y, but not really relevant 
    } while (y[i]>=sin(x[i])+2); 
} 
関連する問題