c ++ 11 — проблемы с классом c ++ 11 mersenne_twister_engine

Я пытался использовать класс C ++ 11 mersenne_twister_engine ( http://www.cplusplus.com/reference/random/mersenne_twister_engine/) генерировать числа в интервале [0,1], однако я постоянно получаю 0 на каждом числе.

Вот мой фрагмент кода

unsigned seed1 = std::chrono::system_clock::now().time_since_epoch().count();

std::mt19937 generator(seed1);
for (int i=0; i < WIDTH * HEIGHT; i++) //GENERATES THE MATRIX OF CONNECTIVITY
{

double random = generator()/generator.max();
if ( random  > VERT_CONNECTIVITY )
vert_con[i] = 0;
else vert_con[i] = 1;}

generator () и generator.max (), кажется, работают … Это просто случайно, что дает мне 0!

Спасибо!

1

Решение

В C ++ / на целые числа приводит к целому числу. Например, 11/2 дает 5, а не 5,5. Таким же образом a / b всегда ноль, если a < b,

Ваша проблема здесь:

generator()/generator.max()

generator() а также generator.max() оба возвращают целые числа и, конечно же, generator.max() >= generator()Таким образом, результат равен нулю (если вам не очень повезло получить max номер, в этом случае результат будет один).

Чтобы это исправить, вы можете просто разыграть это:

(double)generator()/generator.max()
0

Другие решения

Используя один из распределения предусмотрено в случайный заголовок наверное, имеет больше смысла. Как указывает Кубби станд :: bernoulli_distribution Похоже, это хорошо подходит для вашей проблемы. Это будет генерировать true или же false в соответствии с параметром распределения, который вы передаете:

#include <iostream>
#include <random>
#include <vector>
#include <algorithm>

const int WIDTH = 5 ;
const int HEIGHT = 5 ;
const double VERT_CONNECTIVITY = 0.25 ;

int main()
{
std::random_device rd;
std::mt19937 gen(rd());

// give "true" 1/4 of the time
// give "false" 3/4 of the time
std::bernoulli_distribution d(VERT_CONNECTIVITY);

std::vector<int> vert_con( WIDTH * HEIGHT ) ;

std::generate( std::begin(vert_con), std::end( vert_con ), [&] () { return d(gen) ; } ) ;

for (int i=0; i < WIDTH * HEIGHT; i++)
{
std::cout << vert_con[i] << " " ;
}
std::cout << std::endl ;

return 0 ;
}
5

Возможно, вы ищете generate_canonical<double, bits>(gen)? Это создаст десятичное значение, равномерно распределенное в интервале [0,1) с bits биты случайности (53 является стандартным максимумом, доступным для двойника).

2

mersenne_twister_engine возвращает результаты типа UIntType, Если вы хотите, чтобы результат был двойным, вам нужно привести его к двойному результату.

double random = (double) generator () / generator.max ();

0
По вопросам рекламы [email protected]