Boost Graph Library, генератор Erdos Renyi. Графики всегда имеют одинаковое количество ребер - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь сгенерировать графы Эрдоша-Рени с использованием библиотеки графов буста.

В приведенном ниже коде, взятом из документации Boost 1.72

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

Спасибо за любую помощь.

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/erdos_renyi_generator.hpp>
#include <boost/random/linear_congruential.hpp>
#include <iostream>

using namespace std;

typedef boost::adjacency_list<> Graph;
typedef boost::sorted_erdos_renyi_iterator<boost::minstd_rand, Graph> ERGen;

int main()
{
  boost::minstd_rand gen;
  // Create graph with 100 nodes and edges with probability 0.05
  Graph g(ERGen(gen, 100, 0.05), ERGen(), 100);
  cout << num_edges(g)<<endl;
  return 0;
}

1 Ответ

1 голос
/ 19 апреля 2020

Вы должны использовать рандомизированное начальное число:

boost::minstd_rand gen(std::random_device{}());

Характер PRNG заключается в том, что они генерируют детерминированные c выходные данные из данного состояния.

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/erdos_renyi_generator.hpp>
#include <boost/random/linear_congruential.hpp>
#include <iostream>
#include <random>

using namespace std;

typedef boost::adjacency_list<> Graph;
typedef boost::sorted_erdos_renyi_iterator<boost::minstd_rand, Graph> ERGen;

int main() {
    boost::minstd_rand gen(std::random_device{}());
    // Create graph with 100 nodes and edges with probability 0.05
    Graph g(ERGen(gen, 100, 0.05), ERGen(), 100);
    cout << num_edges(g) << endl;
}

Отпечатки, например

515
491
518
511
...