2017-10-14 76 views
3

我想在x轴和曲线y = sin(x)+2(例如)之间选择50个随机点。我想随机点在这个二维区域均匀分布。我这样做: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范围内的矩形区域中创建随机点,最大为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); 
}