首页 > 其他分享 >rand VS mt19937

rand VS mt19937

时间:2024-04-12 22:11:06浏览次数:33  
标签:rand Mt19937 int 平均数 mt19937 VS 随机数

C++随机数 rand Vs mt19937

rand 和 mt19937 介绍

众所周知,程序无法模拟出真正的随机数,所以我们所说的随机数都是相对随机伪随机数

rand 是一种常用的随机数,C++ 初学者一般接触的都是他,但是他有缺点,随机性不高,周期短,质量低。

Mt19937 用法与 rand 一样但是他随机性高,周期长,质量高。

先放上进行实验对比的两个代码:

我们通过多次随机数(\(0\) 到 \(100\) 的范围内随机)。

  • rand 随机数
mt19937 myrand(time(0));
#define rd(l,r) (rand()%(r-l+1)+l)
void solve(){ 
    srand(time(0));
    freopen("rd3.txt ","w",stdout);
    int n = 1e9;
    int sum = 0;
    For(i,1,n){
        int tmp = rd(0,100);
        sum += tmp;
        cout<<(double)sum / (double) i<<endl;
    }
    cout<<(double)sum/double(n);
}
  • mt19937 随机数
mt19937 myrand(time(0));
#define rd(l,r) (myrand()%(r-l+1)+l)
void solve(){ 
    srand(time(0));
    freopen("mt3.txt ","w",stdout);
    int n = 1e9;
    int sum = 0;
    For(i,1,n){
        int tmp = rd(0,100);
        sum += tmp;
        cout<<(double)sum / (double) i<<endl;
    }
    cout<<(double)sum/double(n);
}

Part 1 对比随机数的实时平均数(200次)

  • Mt19937

  • Rand

通过用眼睛直接看,我们可以感受到他们都逐渐趋于中间的一个数 \(50\),那是理论上的平均数,证明,在多次实验之后,频率 趋近于 概率

此时,两个随机方法的区别都不大,都有不小的波动。

因为次数太少了。接下来,增大次数。

Part 2 对比随机数的实时平均数(10000次)

  • Mt19937

  • Rand

由此可见,前者大约在 \(1000\) 次的时候就已经趋近于一个常数了,直线也不再曲折

而后者在 \(4000\) 到 \(5000\) 次的时候还有一些波折。

因此看得出来 Mt19937 更加稳定,也就是他的随机性更加分布均匀,更加“随机”。显然前者要优于后者。

Part 3 对比最后的平均数(10000000次)

我们对两个代码进行了 \(10^7\) 次随机数。

结果如下:

  • Mt19937
    \(50.0005\),\(50.0002\),\(49.9965\),\(49.9984\)。
    平均数:\(49.9989\)。与理论答案相差 \(0.0011\)。

    • rand

$ 49.9637$,\(49.9656\),\(49.96\),\(49.9592\)。

平均数:\(49.962125\),与理论答案相差 \(0.037875\)。约为 \(0.0379\)。

显然相差越小,随机数质量更高,因此 Mt19937 有优于rand。

虽然相差小,但是在 Sa 种有时候取决了你的程序是否通过。

如果想看 Sa,请看:

Cnblogs 中文版

Codeforces 英文版

Part 4 对比最后的平均数(1000000000次)

这一次,我们进行了 \(10^9\) 次随机数,随机数逐渐稳定,几乎可以达到一个常数,精度也非常高,我们看实验结果吧!

mt19937 :\(50.001\)

rand:\(49.9613\)

尽管次数很多很多,但是 rand 却依然保持在 \(49.96\) 左右,证明,rand 还是有一定的偏差,而且不小。达到 \(0.04\),而 mt 的误差我认为几乎可以省略。

总结

通过各种实验数据的对比,mt19937 的随机数质量远高于rand,所以我们在写代码或在写对拍的时候尽量用 mt19937,提高随机数质量。
v

标签:rand,Mt19937,int,平均数,mt19937,VS,随机数
From: https://www.cnblogs.com/gsczl71/p/18132237

相关文章

  • vscode配置gdb调试外部程序
    有一个工程是用qtcreator编译的我现在用vscode远程访问的这个工程,目前只能在vscode界面编辑代码。编译需要在qtcreator下面。刚开始也只能在qtcreator下面调试(debug,打断点)目前在vscode里面安装了gdb工具之后,就可以直接调试qtcreator编译好的二进制文件了。而且可以打断点......
  • 使用 flash_download_tool 下载 Vscode PlatformIO 开发 ESP32 的 bin 文件
    一言蔽之:先使用PlatformIO的命令找到PlatformIO是怎么烧录的,然后照葫芦画瓢即可。前提,VScode已经能够烧录固件了,使用PlatformIO打开所需的项目。打开VScode终端执行:piorun-v-tupload执行了之后,PlatformIO就开始编译固件并上传了,找到关键性的东西<lambda>(["up......
  • VS studio上查看标准cout输出
    VSstudio上查看标准cout输出网上的方法在解决方案管理器中,单击选中项目后,点击菜单【视图】->【属性页】在生成事件->生成后事件->命令行(BuildEvents->Post-BuildEvent->Command)Line)中增加$(OutDir)$(ProjectName).exe顾名思义,这个方法是在生成结束后,使用命令行执行生成的......
  • VS studio 上开发Qt——Qt VS studio Tool的使用
    1.VS上安装Qt扩展点击菜单栏【扩展】->【管理扩展】,在搜索框搜索“Qt”,点击下载QtVisualStudioTools,以2022版为例,需要关闭所有窗口才能执行安装关闭VS后,弹出安装窗口,等待其安装完成2.新建QT工程测试等待安装完成后,添加一个QtVertion后(前提已经安装了Qt开发环境)即可......
  • VSCode 如何删除无用的语言格式?
    1.情景展示在VisualStudioCode当中,支持很多语言格式。但问题在于,我只是将它当做NotePad++的替代品。当我通过Ctrl+N新建一个文件,并将指定的代码拷贝到VSCode中后,由于默认开启了自动检测语法功能。VSCode总是将java代码识别成Groovy语言,真他妈离谱。如何解决这个问题?2.......
  • visual studio vim vsvim配置
    vsvim的配置setai"自动缩进宽度setsw=4setts=4"关闭高亮显示setnohlsearchsetissetignorecasesetbackspace=indent,eol,startsetclipboard=unnamedsetnumber"设置leaderkey为空格""letmapleader="""jk用于退出j:inor......
  • 配置VSCODE
    ***官网配置文件:**https://code.visualstudio.com/docs/cpp/config-mingw点击查看代码gcc--versiong++--versiongdb--version![](https://img2024.cnblogs.com/blog/3425643/202404/3425643-20240411153032565-1541800147.png)其他:https://blog.csdn.net/qq_215673......
  • Windos + Vscode搭建Go开发环境
    本文已Go1.21.9为例安装相关软件1.点击下载Golang2.点击下载Vscode先安装Go,傻瓜式安装即可,安装完成后在cmd中输入goversion确认是否安装成功安装Vscode,傻瓜式安装即可在Vscode插件中搜索go,安装插件设置代理goenv查看当前环境变量goenv-wGO1......
  • 域控软件安全隔离关键技术剖析:MCU域 VS SOC域
    安全隔离的需求    功能安全开发中,软件阶段由软件V模型左边的软件安全需求SSR开始。SSR是从技术安全需求TSR中提取出软件的功能安全需求,大多数情况下具有不同的ASIL等级。图1 功能安全软件开发V模型    随后,软件安全需求会被分配到软件架构中的软件组件中。......
  • VScode里用MPE插件导出带大纲的HTML和PDF文件
    前置条件:1.在VScode里安装好MarkdownPreviewEnhanced插件2.导出PDF文件,需要用到Prince软件,要先在电脑上安装Prince软件,可以去它的官网下载                Prince-DownloadPrince(princexml.com)windows系统的,选这个就可以了,解压后放在自己想放的......