Я хотел бы генерировать точки (х, у) равномерно на прямоугольнике. Сначала вы вводите 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;
}
В программировании нет такой вещи, как лучшие решения, есть только разные решения.
http://www.boost.org/doc/libs/1_41_0/libs/random/random-concepts.html
Boost предлагает отличные случайные функции, и вы можете посмотреть, что они также хороши для отладки метода Монте-Карло.
Вы используете 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);
}
Если я не прочитал ваш вопрос, я бы ожидал увидеть что-то вроде этого кода 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;
}
Я печатаю эти значения, но вы, вероятно, хотите сохранить их в структуре данных, которую вы можете использовать для моделирования в Монте-Карло.