笔记 | 如何正确地生成一个随机数
在最近的一场CF的题解中,提到了这篇blog:Don't use rand(): a guide to random number generators in C++
大概概述一下这篇神仙blog说了啥:
- CF评测机上(以及我们会遭遇的许多windows评测机上)RAND_MAX很小,只有32767
- 不幸的是,random_shuffle用的也是这个自带的rand(),元素在数组里移动的距离也很小。
- rand()使用的伪随机算法是 linear congruential generator (线性同余发生器),在低位循环节很低。
那么如何正确地生成一个随机数呢?神仙blog提供了这样一个东西:
这个奇葩的名字来自于它使用的算法——Mersenne Twister算法,以及它用到的质数——219937−1219937−1。
怎么用呢?
mt19937 rng(seed);
printf("%u\n", rng());
上面那句相当于srand(seed),然后调用你定义的rng()可以获得一个unsigned int类型的随机数。
如果你要生成unsigned long long 类型的话,使用mt19937_64即可。
那么怎么替代random_shuffle()呢?使用shuffle()函数,把你的mt19937传进去,像这样:
shuffle(a, a + n, rng);
这样就能让数组内的元素移动足够大的距离——让shuffle更随机了。
附:完整生成随机数代码
#include <cstdio>
#include <chrono>
#include <random>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int main(){
printf("%u\n", rng());
return 0;
}
本文作者:胡小兔
博客地址:http://rabbithu.cnblogs.com
博客地址:http://rabbithu.cnblogs.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构