在 C++ 中生成随机数

generating random numbers in c++

本文关键字:随机数 C++      更新时间:2023-10-16

我需要生成一个介于 1 和 n 之间的随机数,其中 n 是无符号整数。如果 n 是 int,我会简单地写1 + rand()% n .但不幸的是,n 是无符号的 int。你有什么建议?

rand() 应尽可能避免*。使用 http://en.cppreference.com/w/cpp/numeric/random

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 engine(rd());
    std::uniform_int_distribution<unsigned> dist(1, 77);
    for (int i = 0; i != 5; ++i)
        std::cout << dist(engine) << 'n';
}

* 因为它共享全局状态,所以经常被实现为线性同余引擎,这有一些缺点,它的范围通常只有 0-2^16。此外,% n 其中 n 不是范围的精确倍数不会产生均匀分布

编辑:这可能看起来有点矫枉过正,但从技术上讲,人们会想要这样的东西,因为mt19937需要一点"热身":

std::mt19937 create_seeded_rng() 
{ 
    std::random_device rd; 
    std::array<std::mt19937::result_type, std::mt19937::state_size> seed_data; 
    std::generate(seed_data.begin(), seed_data.end(), std::ref(rd)); 
    std::seed_seq seq(seed_data.begin(), seed_data.end()); 
    return std::mt19937(seq); 
} 
int main() 
{ 
    std::mt19937 rng = create_seeded_rng(); 
    std::uniform_int_distribution<int> dist(0, 100); 
    for (unsigned i = 0; i != 100; ++i) 
        std::cout << dist(rng) << 'n'; 
}