C++11 random numbers

C++11 random numbers

本文关键字:numbers random C++11      更新时间:2023-10-16

我需要生成随机数,但从尽可能宽的范围(至少64位)。我不关心分布是否完美,所以std::rand()可以工作,但它只返回int。我知道c++11有一些随机数生成功能,可以给出任何大小的数字,但使用起来非常复杂。有人可以张贴一个简单的例子,如何使用它尽可能简单地获得所描述的功能(64位或更多的随机数)在尽可能简单的方式(如std::rand())?

这是如何使用c++ 11随机数生成用于此目的(从http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution):

调整)
#include <random>
#include <iostream>
int main()
{
  /* Initialise. Do this once (not for every
     random number). */
  std::random_device rd;
  std::mt19937_64 gen(rd());
  /* This is where you define the number generator for unsigned long long: */
  std::uniform_int_distribution<unsigned long long> dis;
  /* A few random numbers: */    
  for (int n=0; n<10; ++n)
    std::cout << dis(gen) << ' ';
  std::cout << std::endl;
  return 0;
}

您可以使用cstdint中的std::uintmax_t而不是unsigned long long来获得最大可能的整数范围(不使用实际的大整数库)。

我们可以很容易地将随机数生成器引擎包装成像这样的类rand/rand方法:

#include <random>
#include <iostream>
struct MT19937 {
private:
    static std::mt19937_64 rng;
public:
    // This is equivalent to srand().
    static void seed(uint64_t new_seed = std::mt19937_64::default_seed) {
        rng.seed(new_seed);
    }
    // This is equivalent to rand().
    static uint64_t get() {
        return rng();
    }
};
std::mt19937_64 MT19937::rng;

int main() {
    MT19937::seed(/*put your seed here*/);
    for (int i = 0; i < 10; ++ i)
        std::cout << MT19937::get() << std::endl;
}

(像srandrand一样,这个实现不关心线程安全。)

包装器函数非常简单,你可以直接使用引擎。

#include <random>
#include <iostream>
static std::mt19937_64 rng;
int main() {
    rng.seed(/*put your seed here*/);
    for (int i = 0; i < 10; ++ i)
        std::cout << rng() << std::endl;
}

不是c++ 11,但足够简单

((unsigned long long)rand() << 32) + rand()这里我们生成了int64的两个部分作为int32的

JasonD指出的,它假设rand()生成32位整数。这是可能的rand() << x, rand() << (2*x), rand() << (3*x)等,其中x <= bit's由rand() number '生成。