gpt4 book ai didi

c++ - 伪随机数生成器的相同调用之间的不同行为

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:22 24 4
gpt4 key购买 nike

我目前正在努力实现一个简单的图形类,我想要的方法之一是让它返回一个随机邻居,算法如下所示。但是,我发现每次运行该程序时,返回的 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;
}

我在其中使用此 Graph 类的 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).. help?

谢谢!

最佳答案

rand() 是众所周知的 shonky。如果您运行一些测试并使用时间接近的种子,则它产生的第一个数字的值将始终接近。如果可以的话,我建议使用类似 boost::random 的东西。

关于c++ - 伪随机数生成器的相同调用之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com