众所周知,随机数是大赛题目生成大数据和对拍或单纯骗分的常用方法
C++ 随机数生成方法
C++ 提供了多种生成随机数的方式,从传统的 rand() 函数到现代的 <random> 库。以下是几种常见的方法:
使用 rand() 和 srand()
rand() 是 C 标准库中的函数,通过线性同余算法生成伪随机数。需要配合 srand() 设置种子以确保每次运行生成不同的序列。如果没有设置种子,那么随机数就像一个已赋值数组,根本不能做到随机!
#include <cstdlib>
#include <ctime>
int main() {
srand(time(0)); // 设置种子为当前时间
int random_num = rand() % 100; // 生成 0-99 的随机数
return 0;
}
缺点:rand() 生成的随机数质量较低,且分布不均匀。
使用 C++11 <random> 库
C++11 引入了 <random> 库,提供了更强大的随机数生成工具,包括多种引擎和分布。
#include <random>
#include <iostream>
int main() {
std::random_device rd; // 硬件随机数生成器(如果可用)
std::mt19937 gen(rd()); // 使用 Mersenne Twister 引擎
std::uniform_int_distribution<> dist(1, 100); // 均匀分布
int random_num = dist(gen); // 生成 1-100 的随机数
std::cout << random_num << std::endl;
return 0;
}
优点:随机质量高,支持多种分布(如均匀、正态、泊松等)。
常见随机数引擎
std::mt19937:Mersenne Twister 算法,速度快且随机性好。std::minstd_rand:线性同余算法,简单但随机性较弱。std::random_device:基于硬件的真随机数生成器(可能较慢)。
常见随机数分布
std::uniform_int_distribution:均匀整数分布。std::uniform_real_distribution:均匀浮点数分布。std::normal_distribution:正态分布。std::bernoulli_distribution:伯努利分布(布尔值)。
生成特定范围的随机数
使用 std::uniform_int_distribution 可以方便地生成指定范围的随机数:
std::uniform_int_distribution<int> dist(10, 20); // 生成 10-20 的随机整数
int random_num = dist(gen);
生成随机浮点数
std::uniform_real_distribution<double> dist(0.0, 1.0); // 生成 0.0-1.0 的随机浮点数
double random_float = dist(gen);
生成非均匀分布的随机数
例如,生成均值为 0、标准差为 1 的正态分布随机数:
std::normal_distribution<double> dist(0.0, 1.0);
double random_normal = dist(gen);
注意事项
- 避免频繁创建引擎和分布对象,尽量复用。
- 使用
std::random_device初始化种子,以提高随机性。 - 对于高性能需求,选择轻量级引擎(如
std::minstd_rand)。
1068

被折叠的 条评论
为什么被折叠?



