2013-12-18 4 views
1

Я хотел бы создать точки (x, y) равномерно на прямоугольнике. Сначала вы вводите minX и maxX и minY maxY, а затем генерируете (x, y) равномерно. Основной код, показанный ниже, является лучшим способом его достижения? (Мне это нужно, чтобы метод Монте-Карло, чтобы сделать сюжет)Создать точки (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; 
} 
+3

«Лучше» в каком смысле? – blackbird

+0

Для начала установка семени может иметь смысл, но я иначе согласен с blackbird. –

+0

Вам не нужны две петли? Один над x и внутренний цикл над y. – duffymo

ответ

1

В программировании там нет такого понятия, как лучшие решения есть только различные решения.

http://www.boost.org/doc/libs/1_41_0/libs/random/random-concepts.html

подталкивания предлагает большие случайные функции, а также вы можете посмотреть, что они также хороши для отладки метода Монте-Карло.

+2

* В программировании нет такого понятия, как лучшие решения, есть только разные решения. Хм, многие думают, что, например, решение многомиллионного времени для проблемы коммивояжера было бы лучше любого из известных, хуже, чем полиномиально- временные решения. –

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

я печатаю эти значения, но вы, вероятно, хотите, чтобы сохранить их в структуре данных что вы можете подать на ваш симулятор Монте-Карло для оценки.

+0

Существует различие между _randomly_ распределяющими точками (как OP делает (но не совсем сказал, что он хотел)), и _ равномерно распределяет точки (как и вы). Если нет никакой квалификации, «случайные точки, равномерно распределенные», вероятно, означают, что он хочет, чтобы его точки были независимы и идентично распределены, что и сделал его исходный код. – Teepeemm

+0

Вот что я читал: «Я хотел бы генерировать точки (x, y) * равномерно * на прямоугольнике. Сначала вы вводите minX и maxX и minY maxY, а затем генерируете (x, y) * равномерно *« Я не вижу случайный здесь. Рандомизация возникает, когда он оценивает моделирование методом Монте-Карло в каждой точке. – duffymo

+0

Вот что он сказал. Но его код распределяет их случайным образом по всему прямоугольнику. И вообще, симуляция Монте-Карло включает в себя поиск точки в прямоугольнике, задание вашего вопроса об этой точке, а затем повторение с другой точки. Распространение их равномерно не было бы возможным. Но ОП определенно мог бы быть более ясным относительно того, чего он хотел. – Teepeemm

Смежные вопросы