在c ++中产生随机双数

如何在c ++中的两个双打之间生成随机数字,这些数字应该看起来像xxxxx,yyyyy。

就是这样

double fRand(double fMin, double fMax) { double f = (double)rand() / RAND_MAX; return fMin + f * (fMax - fMin); } 

记得每次程序启动时用适当的种子调用srand()。

该解决scheme需要C ++ 11(或TR1)。

 #include <random> int main() { double lower_bound = 0; double upper_bound = 10000; std::uniform_real_distribution<double> unif(lower_bound,upper_bound); std::default_random_engine re; double a_random_double = unif(re); return 0; } 

有关更多详细信息,请参阅John D. Cook的“使用C ++ TR1生成随机数” 。

另请参阅Stroustrup的“随机数字生成” 。

如果准确性是一个问题,那么可以通过随机化重要的位来创build更精细的随机数。 假设我们想要在0.0到1000.0之间加倍。

在MSVC(12 / Win32)RAND_MAX是例如32767。

如果你使用普通的rand()/RAND_MAXscheme, rand()/RAND_MAX你的差距将会是最大的

 1.0 / 32767.0 * ( 1000.0 - 0.0) = 0.0305 ... 

在IEE 754双variables(53个有效位)和53位随机化的情况下,0到1000问题的最小可能随机化间隙将是

 2^-53 * (1000.0 - 0.0) = 1.110e-13 

因此显着降低。

缺点是需要4个rand()调用来获得随机化的整数(假设一个15位的RNG)。

 double random_range (double const range_min, double const range_max) { static unsigned long long const mant_mask53(9007199254740991); static double const i_to_d53(1.0/9007199254740992.0); unsigned long long const r( (unsigned long long(rand()) | (unsigned long long(rand()) << 15) | (unsigned long long(rand()) << 30) | (unsigned long long(rand()) << 45)) & mant_mask53 ); return range_min + i_to_d53*double(r)*(range_max-range_min); } 

如果尾数或RNG的位数未知,则需要在函数内获得相应的值。

 #include <limits> using namespace std; double random_range_p (double const range_min, double const range_max) { static unsigned long long const num_mant_bits(numeric_limits<double>::digits), ll_one(1), mant_limit(ll_one << num_mant_bits); static double const i_to_d(1.0/double(mant_limit)); static size_t num_rand_calls, rng_bits; if (num_rand_calls == 0 || rng_bits == 0) { size_t const rand_max(RAND_MAX), one(1); while (rand_max > (one << rng_bits)) { ++rng_bits; } num_rand_calls = size_t(ceil(double(num_mant_bits)/double(rng_bits))); } unsigned long long r(0); for (size_t i=0; i<num_rand_calls; ++i) { r |= (unsigned long long(rand()) << (i*rng_bits)); } r = r & (mant_limit-ll_one); return range_min + i_to_d*double(r)*(range_max-range_min); } 

注意:我不知道在所有平台上,无符号long long(64位)的位数是否大于双尾数位(IEE 754的53位)。 包括像if (sizeof(unsigned long long)*8 > num_mant_bits) ...这样的检查可能是“聪明的” if (sizeof(unsigned long long)*8 > num_mant_bits) ...如果不是这样的话。

这段代码直接来自Stroustrup的The C ++ Programming Language(第4版) §40.7; 它需要C ++ 11:

 #include <functional> #include <random> class Rand_double { public: Rand_double(double low, double high) :r(std::bind(std::uniform_real_distribution<>(low,high),std::default_random_engine())){} double operator()(){ return r(); } private: std::function<double()> r; }; #include <iostream> int main() { // create the random number generator: Rand_double rd{0,0.5}; // print 10 random number between 0 and 0.5 for (int i=0;i<10;++i){ std::cout << rd() << ' '; } return 0; } 

这应该是高性能,线程安全和足够灵活的许多用途:

 #include <random> #include <iostream> template<typename Numeric, typename Generator = std::mt19937> Numeric random(Numeric from, Numeric to) { thread_local static Generator gen(std::random_device{}()); using dist_type = typename std::conditional < std::is_integral<Numeric>::value , std::uniform_int_distribution<Numeric> , std::uniform_real_distribution<Numeric> >::type; thread_local static dist_type dist; return dist(gen, typename dist_type::param_type{from, to}); } int main(int, char*[]) { for(auto i = 0U; i < 20; ++i) std::cout << random<double>(0.0, 0.3) << '\n'; } 

像这样的东西:

 #include <iostream> #include <time.h> using namespace std; int main() { const long max_rand = 1000000L; double x1 = 12.33, x2 = 34.123, x; srandom(time(NULL)); x = x1 + ( x2 - x1) * (random() % max_rand) / max_rand; cout << x1 << " <= " << x << " <= " << x2 << endl; return 0; } 
  • 这是为c ++
 #include "stdafx.h" #include "iostream" #include "ctime" using namespace std; double getRandom(double min, double max) { double before = rand() % (int)max + (int)min; double after = (double)rand() / RAND_MAX; double result = before + after; if (result < min || result > max) { result = getRandom(min, max); } return result; } int main() { srand (time(NULL)); for (int i = 0; i < 100; i++) { double number = getRandom(-1.57079632679, 1.57079632679); cout << number << endl; } system("pause"); }