提升随机生成器返回相同的值
Boost Random Generators returning identical values
不使用 C++ 11 随机
正在寻找提升随机数的专家...我需要在很多很多不同的范围内生成随机数。我写了以下功能:
#include <iostream>
#include <boost/random.hpp>
#include <boost/generator_iterator.hpp>
boost::mt19937 g_oRng;
int generateIntVariate(int p_iMin, int p_iMax){
boost::uniform_int<> min_to_max(p_iMin, p_iMax);
boost::variate_generator< boost::mt19937, boost::uniform_int<> > oGen(g_oRng, min_to_max);
return oGen();
}
float generateFloatVariate(int p_fMin, p_fMax){
boost::uniform_real<> min_to_max(p_fMin, p_fMax);
boost::variate_generator< boost::mt19937, boost::uniform_real<> > oGen(m_oRng, min_to_max);
return oGen();
}
int main(){
struct timeval tp;
gettimeofday(&tp, NULL);
g_oRng = boost::mt19937((int)tp.tv_sec);
for(int i = 0 ; i < 10 ; ++i){
std::cout << generateIntVariate(0, 10) << ", " << generateFloatVariate(0.0f, 10.0f) << std::endl;
}
}
问题是每次执行时,这两个函数 return 给定范围内的数字完全相同。
(gdb) p generateIntVariate(0, 10)
= 8
(gdb) p generateIntVariate(0, 10)
= 8
(gdb) p generateIntVariate(0, 10)
= 8
(gdb) p generateIntVariate(0, 10)
= 8
float 函数会发生与上述相同的情况。有什么方法可以使用 boost 随机发行版来完成我想做的事情吗?
boost::variate_generator
的构造函数如下所示:
variate_generator(Engine e, Distribution d);
- 意思是它不会改变传入的状态 m_oRng
而是复制它。
我建议省略 variate_generator
,只使用 boost::uniform_int<>::operator()
。
不使用 C++ 11 随机
正在寻找提升随机数的专家...我需要在很多很多不同的范围内生成随机数。我写了以下功能:
#include <iostream>
#include <boost/random.hpp>
#include <boost/generator_iterator.hpp>
boost::mt19937 g_oRng;
int generateIntVariate(int p_iMin, int p_iMax){
boost::uniform_int<> min_to_max(p_iMin, p_iMax);
boost::variate_generator< boost::mt19937, boost::uniform_int<> > oGen(g_oRng, min_to_max);
return oGen();
}
float generateFloatVariate(int p_fMin, p_fMax){
boost::uniform_real<> min_to_max(p_fMin, p_fMax);
boost::variate_generator< boost::mt19937, boost::uniform_real<> > oGen(m_oRng, min_to_max);
return oGen();
}
int main(){
struct timeval tp;
gettimeofday(&tp, NULL);
g_oRng = boost::mt19937((int)tp.tv_sec);
for(int i = 0 ; i < 10 ; ++i){
std::cout << generateIntVariate(0, 10) << ", " << generateFloatVariate(0.0f, 10.0f) << std::endl;
}
}
问题是每次执行时,这两个函数 return 给定范围内的数字完全相同。
(gdb) p generateIntVariate(0, 10)
= 8
(gdb) p generateIntVariate(0, 10)
= 8
(gdb) p generateIntVariate(0, 10)
= 8
(gdb) p generateIntVariate(0, 10)
= 8
float 函数会发生与上述相同的情况。有什么方法可以使用 boost 随机发行版来完成我想做的事情吗?
boost::variate_generator
的构造函数如下所示:
variate_generator(Engine e, Distribution d);
- 意思是它不会改变传入的状态 m_oRng
而是复制它。
我建议省略 variate_generator
,只使用 boost::uniform_int<>::operator()
。