【问题标题】:Generate points(x,y) on rectangle uniformly在矩形上均匀生成点(x,y)
【发布时间】:2023-04-05 12:07:01
【问题描述】:

我想在矩形上均匀地生成点(x,y)。首先你输入 minX 和 maxX 和 minY maxY 然后你统一生成 (x,y),下面显示的基本代码有没有更好的方法来实现它? (我需要它以蒙特卡罗方法来制作情节)

#include <iostream>
#include <random>
double drand(const double min = 0., const double max = 1.)
{
    return (max - min) * static_cast<double>(rand()) / static_cast<double>      (RAND_MAX)+min;
}
int main(int argc, char **argv)
{
    for(unsigned short int i=0;i<1000;++i)
    {
        std::cout << "x " << drand(minX, maxX) << std::endl;
        std::cout << "y " << drand(0., maxY) << std::endl;
    }
return 0;
}

【问题讨论】:

  • “更好”在什么意义上?
  • 对于初学者来说,设置种子可能是有意义的,但我同意 blackbird。
  • 你不需要两个循环吗?一个在 x 上,一个在 y 上的内循环。

标签: c++ math random uniform


【解决方案1】:

您正在使用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);
}

【讨论】:

  • 我有一个菜鸟问题:你为什么使用静态关键字?我试了一下,发现使用 static 它更快(如果我们多次调用 this 函数),所以我想知道为什么。另外,为什么不直接在 std::uniform_real_distribution 的初始化中使用 min 和 max ?那么静态关键字也会有帮助吗?
  • @orbit 在构建时序测试时必须非常小心。你几乎可以肯定做了一些会产生错误结果的事情。创建 Mersenne Twister 生成器的计算成本很高,创建 std::random_device() 也是如此。构建时序测试非常非常容易出错;我自己也犯过这个错误。关于将static 用于生成器:没有理由这样做,只有一次。也就是说,我可以使分发自动而不是静态。构建std::uniform_real_distribution 并不是那么昂贵。
【解决方案2】:

除非我误读了您的问题,否则我希望看到类似这样的 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;
}

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

【讨论】:

  • 随机分布点(就像 OP 所做的那样(但没有说这就是他想要的))和 均匀 分布之间是有区别的点(就像你做的那样)。如果没有限定,“均匀分布的随机点”可能意味着他希望他的点独立且均匀分布,这是他的原始代码完成的。
  • 这是我读到的内容:“我想在矩形上均匀地生成点(x,y)。首先输入 minX 和 maxX 以及 minY maxY,然后生成(x,y) 均匀地" 我在这里看不到随机性。当他在每个点上评估蒙特卡洛模拟时,随机化就出现了。
  • 他是这么说的。但他的代码是在整个矩形中随机分布它们。一般来说,蒙特卡洛模拟涉及在矩形中找到某个点,询问您对该点的问题,然后重复另一个点。均匀地传播它们不是要走的路。但 OP 绝对可以更清楚他想要什么。
猜你喜欢
  • 2013-05-12
  • 2020-12-24
  • 2012-05-21
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2012-06-26
相关资源
最近更新 更多