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++ 11支持,甚至没有TR1(因此你没有其他选择)

那么你可以考虑使用以下C风格的解决方案,(为了这个社区的声誉〜参见rand()Considered Harmful)是用透视字体编写的:

下面是从间隔从产生随机数的简单的C风格的功能minmax,包容性.这些数字似乎非常接近于均匀分布.

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分钟

除此以外:

使用<random>就像Kerrek SB已经指出的那样.


spe*_*rcw 5

Boost.Random是一个用于生成伪随机数的优秀库(如果平台支持它,则是真正随机的).

  • 我检查了他们的文档只是为了确保他们没有声称生成真正随机的数字,而他们不是.那你为什么要在答案中包含这个呢? (3认同)
  • 它包括“random_device”(就像现在标准的 &lt;random&gt; 标头一样)以提供对具有此类设备的平台上的非确定性统一随机数生成器的访问。(例如,操作系统通过观察网络流量等操作收集随机数据,并通过 /dev/random 提供对该数据的访问) (2认同)