生成随机数的最佳方法是什么?
答案 0 :(得分:24)
您应该使用<random>
:
#include <random>
typedef std::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(0, 7);
rng_type rng;
int main()
{
// seed rng first:
rng_type::result_type const seedval = get_seed(); // get this from somewhere
rng.seed(seedval);
rng_type::result_type random_number = udist(rng);
return random_number;
}
Pre C ++ 11你可以在TR1(<tr1/random>
,std::tr1::mt19937
等)或Boost.random中找到它,基本上具有相同的接口(尽管存在细微差别)。
答案 1 :(得分:12)
然后您可以考虑使用以下C风格的解决方案(为了这个社区的声誉〜请参阅rand() Considered Harmful)是用透视字体编写的:< / p>
这是一个简单的C风格函数,它从min
到max
的间隔生成随机数。这些数字似乎非常接近于均匀分布。
int irand(int min, int max) {
return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
}
并且在使用之前不要忘记致电srand
:
int occurences[8] = {0};
srand(time(0));
for (int i = 0; i < 100000; ++i)
++occurences[irand(1,7)];
for (int i = 1; i <= 7; ++i)
printf("%d ", occurences[i]);
输出:14253 14481 14210 14029 14289 14503 14235
另见:
Generate a random number within range?
Generate random numbers uniformly over an entire range
并找到一些时间并至少观看上述video
答案 2 :(得分:6)
Boost.Random是一个用于生成伪随机数的优秀库(如果平台支持的话,它是真正随机的)。
答案 3 :(得分:2)
如果您正在谈论标准C ++库预C ++ 11,则rand和srand是您的随机数生成器。与使用带整数运算的模数相比,有一些方法可以提高这些函数的精度。例如,如果不考虑高速并将结果舍入为int,则可以使用双精度。
至于自定义库,如果你真的想要良好的随机分布和速度,谷歌Mersenne Twister。还有推动选项。
使用C ++ 11,您有<random>
。 http://en.cppreference.com/w/cpp/numeric/random
答案 4 :(得分:1)
我的'随机'库为C ++ 11随机类提供了一个高度方便的包装器。您可以使用简单的“获取”方法完成几乎所有事情。
示例:
auto val = Random::get(-10, 10); // Integer
auto val = Random::get(10.f, -10.f); // Float point
auto val = Random::get<bool>( ) // 0.5% to generate true
auto val = Random::get<bool>( 0.7 ) // 0.7% to generate true
auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...
auto it = Random::get( vec.begin(), vec.end() ); // it = random iterator
auto it = Random::get( vec ); // return random iterator
还有更多的东西!查看github页面: