我目前正致力於實現一個簡單的圖類,並且我想要的方法之一就是讓它返回一個隨機鄰居,如下所示的算法。但是,我發現每次運行程序時,返回nborList[r]
總是返回nborList中的相同元素。僞隨機數發生器在同一個調用之間的不同行爲
IDType Graph::random_neighbor(const IDType source) const
{
IDVector nborList = neighbors(source);
IDType r = nrand(nborList.size());
cout << "TEST Neighbors: ";
for (IDVector::const_iterator iter = nborList.begin();
iter != nborList.end(); ++iter)
cout << *iter << " ";
cout << endl;
cout << "TEST Rand: " << r << endl;
return nborList[r];
}
int nrand(int n) // Returns number [0, n), taken from Accelerated C++
{
if (n <= 0 || n > RAND_MAX)
throw domain_error("Argument to nrand is out of range");
const int bucket_size = RAND_MAX/n;
int r;
do r = rand()/bucket_size;
while (r >= n);
return r;
}
的test.cpp
文件,我使用這個圖形類有這樣的代碼:
#include <ctime>
#include <iostream>
#include "Graph.h"
using std::cout;
using std::endl;
int main()
{
srand(time(NULL));
Graph G(50);
for (int i = 1; i < 25; ++i)
if (i % 2 == 0)
G.add_edge(0, i);
G.add_edge(2, 49);
cout << "Number of nodes: " << G.size() << endl;
cout << "Number of edges: " << G.number_of_edges() << endl;
cout << "Neighbors of node 0: ";
IDVector nborList = G.neighbors(0);
for (IDVector::const_iterator iter = nborList.begin();
iter != nborList.end(); ++iter)
cout << *iter << " ";
cout << endl << endl;
cout << "Random neighbor: " << G.random_neighbor(0) << endl;
cout << "Random number: " << nrand(nborList.size()) << endl;
return 0;
}
輸出:
Number of nodes: 50
Number of edges: 13
Neighbors of node 0: 2 4 6 8 10 12 14 16 18 20 22 24
TEST Neighbors: 2 4 6 8 10 12 14 16 18 20 22 24
TEST Rand: 1
Random neighbor: 4
Random number: 9
我得到的輸出是這樣的,每一次,除了最後一行說Random number: 9
應該改變。然而,TEST Rand: 1
始終爲1,有時當我重新編譯時它會更改爲不同的數字,但在多次運行時它保持相同的數字。在這兩個地方的電話似乎是相同的,使用nrand(nborList.size())
其中nborList = neighbors(source)
..幫助?
謝謝!
一些C++ 11魔法固定它,使用STD在中使用:: random_shuffle()來洗牌矢量,並返回第0個值。 –
adelbertc
2012-01-13 18:15:21