这是我第一次在这里发帖,所以请点赞:)
这是我的问题。
我想使用增强随机数生成器,例如在此示例中完成http://www.boost.org/doc/libs/1_46_1/libs/random/example/random_demo.cpp
这个例子在我的计算机上运行得非常好,唯一的问题是当我在我创建的类中使用它时,输出都是一样的,我不明白为什么因为它们不在示例中。该类的名称称为Edge,有两个私有成员,即A点,B点(经典示例类)。因此,您可以将“边缘”视为具有端点A和B的线段。我的目标是在此线段上绘制一个随机点。
所以当我做的时候
int main(){
Edge test;
for (int i=0;i<10;i++)
std::cout << test.draw_a_double() << endl;
return 0;
}
它总是返回相同的数字:(
这是.h文件中的方法:
double draw_a_Point();
以下是.cpp文件中的“#includes”(我应该把它们放在.h文件中吗?假设我没有在我项目的所有文件中使用它们):
#include <ctime>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>
typedef boost::mt19937 base_generator_type;
以下是我方法中的代码:
base_generator_type generator(42u);
generator.seed(static_cast<unsigned int>(std::time(0)));
boost::uniform_real<> uni_dist(0,1);
boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist);
double diffChosen=uni();
return diffChosen;
我不会在这里返回一个Point对象,因为主要和唯一的问题来自diffChosen总是相同的事实。
问题是否来自只有在随机数发生器的主函数中工作的事实?
谢谢
答案 0 :(得分:1)
以下可能会有所帮助:
double Edge::draw_a_double(base_generator_type& generator)
{
boost::uniform_real<> uni_dist(0,1);
boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist);
double diffChosen = uni();
return diffChosen;
}
int main()
{
base_generator_type generator(42u);
generator.seed(static_cast<unsigned int>(std::time(0)));
Edge test;
for (int i = 0; i < 10; i++) {
std::cout << test.draw_a_double(generator) << std::endl;
}
return 0;
}
解释您的代码失败的原因:
generator
具有生成数字的内部状态。
您可以通过seed
对其进行初始化。
返回一个新的随机数后,其状态会发生变化。
但您每次都会重置其状态:
generator.seed(static_cast<unsigned int>(std::time(0)));
std::time(0)
改变每一秒......
所以你得到的系列随机数的第一个数字相同。