在C ++中生成随机数的最佳方法是什么?

时间:2012-02-27 20:13:36

标签: c++ random numbers

生成随机数的最佳方法是什么?

5 个答案:

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

然后您可以考虑使用以下C风格的解决方案(为了这个社区的声誉〜请参阅rand() Considered Harmful)是用透视字体编写的:< / p>

这是一个简单的C风格函数,它从minmax的间隔生成随机数。这些数字似乎非常接近于均匀分布。

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

的前11分钟

否则:

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

答案 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随机类提供了一个高度方便的包装器。您可以使用简单的“获取”方法完成几乎所有事情。

示例:

  1. 范围内的随机数
  2.   

    auto val = Random::get(-10, 10); // Integer
      auto val = Random::get(10.f, -10.f); // Float point

    1. 随机布尔
    2.   

      auto val = Random::get<bool>( ) // 0.5% to generate true

           

      auto val = Random::get<bool>( 0.7 ) // 0.7% to generate true

      1. 来自std :: initilizer_list
      2. 的随机值
        auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...
        
        1. 来自迭代器范围或所有容器的随机迭代器
        2.   

          auto it = Random::get( vec.begin(), vec.end() ); // it = random iterator

               

          auto it = Random::get( vec ); // return random iterator

          还有更多的东西!查看github页面:

          https://github.com/effolkronium/random