C++ 在矩形上均匀生成点(x,y)

C++ 在矩形上均匀生成点(x,y),c++,math,random,uniform,C++,Math,Random,Uniform,我想在矩形上均匀地生成点(x,y)。首先输入minX、maxX和minY maxY,然后统一生成(x,y),下面显示的基本代码是实现它的更好方法吗?(我需要用蒙特卡罗方法绘制一个图) #包括 #包括 双德兰(恒双最小值=0,恒双最大值=1。) { 返回值(最大值-最小值)*static_cast(rand())/static_cast(rand_max)+min; } int main(int argc,字符**argv) { 对于(unsigned short int int i=0;i您使用

我想在矩形上均匀地生成点(x,y)。首先输入minX、maxX和minY maxY,然后统一生成(x,y),下面显示的基本代码是实现它的更好方法吗?(我需要用蒙特卡罗方法绘制一个图)

#包括
#包括
双德兰(恒双最小值=0,恒双最大值=1。)
{
返回值(最大值-最小值)*static_cast(rand())/static_cast(rand_max)+min;
}
int main(int argc,字符**argv)
{
对于(unsigned short int int i=0;i您使用的是
rand()
。由于几乎任何东西都比
rand()
好,所以您的屏障并不高。既然您显然有C++11,为什么不使用C++11提供的更高级的随机数生成器呢?例如

#include <random>

double drand(const double min = 0., const double max = 1.)
{
   static std:: mt19937_64 mt_generator(std::random_device());
   static std::uniform_real_distribution<double> u_0_1(0.0, 1.0);

   return min + (max - min) * u_0_1(mt_generator);
}
#包括
双德兰(恒双最小值=0,恒双最大值=1。)
{
静态std::mt19937_64 mtu生成器(std::random_device());
静态标准:均匀实分布0(0.0,1.0);
返回最小值+(最大值-最小值)*u_0_1(mt_发生器);
}

除非我误读了您的问题,否则我希望看到类似以下Java代码的内容:

int nx = 10;
int ny = 10;
double x = xmin;
double dx = (xmax-xmin)/nx;
double dy = (ymax-ymin)/ny;
int id = 0;
for (int i = 0; i < nx; ++i) {
    double y = ymin;
    for (int j = 0; j < ny; ++j) {
        System.out.println(id, x, y);
        id++;
        y += dy;
    }
    x += dx;
}
intnx=10;
int ny=10;
双x=xmin;
双dx=(xmax-xmin)/nx;
双dy=(ymax-ymin)/ny;
int id=0;
对于(int i=0;i

我打印了这些值,但您可能希望将它们存储在一个数据结构中,您可以将其提供给蒙特卡罗模拟进行评估。

“更好”在哪种意义上?对于初学者来说,设定一个种子可能是有意义的,但我同意blackbird的观点。你不需要两个循环吗?一个在x上,一个在y上。随机分布点(正如OP所做的(但他没有说这是他想要的))和均匀分布点(正如你所做的)之间有区别。如果没有限定条件,“随机点均匀分布”可能意味着他希望他的点独立且均匀分布,这是他的原始代码实现的。我读到的是:“我想在矩形上均匀地生成点(x,y)。首先输入minX、maxX和minY maxY,然后生成(x,y)一致地”我在这里看不到随机性。当他在每个点评估蒙特卡罗模拟时,随机性就出现了。他是这么说的。但是他的代码在整个矩形中随机分布。通常,蒙特卡罗模拟包括在矩形中找到某个点,问你关于该点的问题,然后用另一点。均匀地传播它们不是一条路。但OP肯定可以更清楚地知道他想要什么。
int nx = 10;
int ny = 10;
double x = xmin;
double dx = (xmax-xmin)/nx;
double dy = (ymax-ymin)/ny;
int id = 0;
for (int i = 0; i < nx; ++i) {
    double y = ymin;
    for (int j = 0; j < ny; ++j) {
        System.out.println(id, x, y);
        id++;
        y += dy;
    }
    x += dx;
}