C++随机数简述

众所周知,随机数是大赛题目生成大数据和对拍或单纯骗分的常用方法

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;
}

优点:随机质量高,支持多种分布(如均匀、正态、泊松等)。

常见随机数引擎
  1. std::mt19937:Mersenne Twister 算法,速度快且随机性好。
  2. std::minstd_rand:线性同余算法,简单但随机性较弱。
  3. 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);

注意事项

  1. 避免频繁创建引擎和分布对象,尽量复用。
  2. 使用 std::random_device 初始化种子,以提高随机性。
  3. 对于高性能需求,选择轻量级引擎(如 std::minstd_rand)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值