Я пытался использовать класс 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!
Спасибо!
В C ++ /
на целые числа приводит к целому числу. Например, 11/2 дает 5, а не 5,5. Таким же образом a / b
всегда ноль, если a < b
,
Ваша проблема здесь:
generator()/generator.max()
generator()
а также generator.max()
оба возвращают целые числа и, конечно же, generator.max() >= generator()
Таким образом, результат равен нулю (если вам не очень повезло получить max
номер, в этом случае результат будет один).
Чтобы это исправить, вы можете просто разыграть это:
(double)generator()/generator.max()
Используя один из распределения предусмотрено в случайный заголовок наверное, имеет больше смысла. Как указывает Кубби станд :: 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 ;
}
Возможно, вы ищете generate_canonical<double, bits>(gen)
? Это создаст десятичное значение, равномерно распределенное в интервале [0,1)
с bits
биты случайности (53 является стандартным максимумом, доступным для двойника).
mersenne_twister_engine
возвращает результаты типа UIntType
, Если вы хотите, чтобы результат был двойным, вам нужно привести его к двойному результату.
double random = (double) generator () / generator.max ();