我想在矩形上均匀生成点(x,y)。首先输入minX和maxX以及minY maxY,然后统一生成(x,y),基本代码如下所示是否有更好的方法来实现它? (我需要用monte carlo方法制作情节)
#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;
}
答案 0 :(得分:1)
在编程中没有更好的解决方案,只有不同的解决方案。
http://www.boost.org/doc/libs/1_41_0/libs/random/random-concepts.html
Boost提供了很棒的随机功能,您可能希望看一下它们也适合调试蒙特卡罗方法。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
除非我误解你的问题,否则我希望看到类似这样的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;
}
我打印这些值,但您可能希望将它们存储在可以提供给蒙特卡罗模拟进行评估的数据结构中。