Ker*_* SB 25
你应该使用<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;
}
Run Code Online (Sandbox Code Playgroud)
前C++ 11你会发现这无论是在TR1( <tr1/random>
,std::tr1::mt19937
等),或在Boost.random,以基本相同的接口(虽然有细微差别).
Lih*_*ihO 13
那么你可以考虑使用以下C风格的解决方案,(为了这个社区的声誉〜参见rand()Considered Harmful)是用透视字体编写的:
下面是从间隔从产生随机数的简单的C风格的功能min
到max
,包容性.这些数字似乎非常接近于均匀分布.
int irand(int min, int max) {
return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
}
Run Code Online (Sandbox Code Playgroud)
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]);
Run Code Online (Sandbox Code Playgroud)
输出: 14253 14481 14210 14029 14289 14503 14235
另请看:
在范围内生成一个随机数?
在整个范围内均匀生成随机数,
并找到一些时间并至少观看上述视频的前11分钟
Boost.Random是一个用于生成伪随机数的优秀库(如果平台支持它,则是真正随机的).