Правильное использование s / rand или Boost :: random - PullRequest
0 голосов
/ 12 ноября 2009

Я знаю, что такого рода вопросы задавались несколько раз, но многие из них сводятся к RTFM, но я надеюсь, что смогу задать правильный вопрос ... Я могу получить квазиопределенный ответ для а также всех остальных относительно реализации.

Я пытаюсь сгенерировать последовательность случайных чисел одним из следующих двух способов:

#include <cstdlib>
#include <ctime>
#include <cmath>

#include "Cluster.h"
#include "LatLng.h"

 srand((unsigned)time(0));
 double heightRand;
 double widthRand;
 for (int p = 0; p < this->totalNumCluster; p++) {

  Option 1.
  heightRand = myRand();
  widthRand = myRand();

  Option 2.
  heightRand = ((rand()%100)/100.0);
  widthRand = ((rand()%100)/100.0);

  LatLng startingPoint( 0, heightRand,  widthRand );
  Cluster tempCluster(&startingPoint);
  clusterStore.insert( clusterStore.begin() + p, tempCluster);
 }

Где myRand ():

#include <boost/random.hpp>

double myRand()
{
 boost::mt19937 rng;
 boost::uniform_int<> six(1,100);

 boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die(rng, six);

 int tempDie = die();
 double temp = tempDie/100.0;

 return temp;
}

Каждый раз, когда я запускаю Вариант 1, я получаю одно и то же число при каждом выполнении каждого цикла. Но отличается при каждом запуске программы.

Когда я запускаю Вариант 2, я получаю 82 из библиотек наддува, поэтому возвращается 0.81999999999999. Я мог понять, было ли это 42, но 82 оставляет меня чесать голову, даже после прочтения случайных документов повышения.

Есть идеи?

DJS.

1 Ответ

3 голосов
/ 12 ноября 2009

С опцией 2 вы не должны создавать новый экземпляр rng и die для каждого вызова.

Я также не уверен, правильно ли я понимаю проблему с вариантом 1: вы вызываете srand () только один раз, но каждый вызов rand () дает вам один и тот же номер? Это .. "необычно". Попробуйте уменьшить цикл до минимума и выведите значение, возвращаемое из rand ().

...