2017-10-14 3 views
3

Je veux choisir 50 points aléatoires entre l'axe des x et la courbe y = sin (x) +2 (par exemple). Je veux que les points aléatoires soient répartis uniformément dans cette région 2D. Je l'ai fait comme ceci:2D points aléatoires sous une courbe en C++

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); 
      } 

Mais ce n'est pas correct, car il donne des points plus denses dans les régions où la courbe est plus proche de l'axe des x. Comment puis-je choisir des points avec une densité égale dans le domaine? Ne pas presser le même nombre/la même probabilité de points sous les parties inférieures de la fonction

+0

que voulez-vous dire uniformément? Alors ils ne sont plus aléatoires! – farbiondriven

+0

Je veux dire dans les régions où la courbe est fermée à x_axis, j'ai besoin de moins de points. Ai-je un sens? @farbiondriven –

+0

@farbiondriven Je pense qu'il signifie uniformément échantillonné où la probabilité d'un point étant dans une région est proportionnelle à la région de la région – WorldSEnder

Répondre

2


Au lieu de faire des points aléatoires dans la zone du rectangle sur la plage x jusqu'à max y.
Mais ignorez ceux qui sont trop élevés sur l'axe y.

I.e. remplacez votre boucle par celle-ci:

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); 
}