随机数生成器性能比较

今天看到一个帖子求随机数用法,看到回复都在使用 rand(),就突发奇想来比较一下 rand()mt19937 的性能。

测试环境

测试于虚拟机中进行。

  • 虚拟机软件:VMware Workstation 17 Pro
  • 操作系统:Ubuntu 24.04 LTS
  • 编译器:GCC 13.2.0
  • 编译命令:g++ ./Code.cpp -std=c++14 -O2 -static -o ./Code
  • CPU:AMD Ryzen 7 6800HS Creator Edition × 2(核)
  • 内存:4096 MB

测试方法

使用 rand()mt19937 分别生成 \(10^7\) 个随机数、计算异或和并记录使用时间。另外还记录了计算 \(1\)\(10^7\) 的异或和的程序所用时间。为避免误差,测试进行三次。

测试结果

注:每次测试结果的第一个数是计算出的异或和,第二个数是运行时间。

rand()

Code

1
2
3
4
5
6
7
8
9
10
11
#include <bits/stdc++.h>
using namespace std;
int sttime, edtime, ans;
int main(){
srand(time(NULL));
sttime = chrono::system_clock::now().time_since_epoch().count();
for(int i = 1; i <= 10000000; i ++ ) ans ^= rand();
edtime = chrono::system_clock::now().time_since_epoch().count();
cout << ans << ' ' << edtime - sttime << '\n';
return 0;
}

第一次:69721856 166411749

第二次:1482914441 163781860

第三次:985165798 165527310

mt19937

Code

1
2
3
4
5
6
7
8
9
10
11
#include <bits/stdc++.h>
using namespace std;
int sttime, edtime, ans;
mt19937 rnd(time(NULL));
int main(){
sttime = chrono::system_clock::now().time_since_epoch().count();
for(int i = 1; i <= 10000000; i ++ ) ans ^= rnd();
edtime = chrono::system_clock::now().time_since_epoch().count();
cout << ans << ' ' << edtime - sttime << '\n';
return 0;
}

第一次:-1197154284 54221094

第二次:1446003541 51768240

第三次:-528284598 50928197

\(1\)\(10^7\) 的异或和

Code

1
2
3
4
5
6
7
8
9
10
#include <bits/stdc++.h>
using namespace std;
int sttime, edtime, ans;
int main(){
sttime = chrono::system_clock::now().time_since_epoch().count();
for(int i = 1; i <= 10000000; i ++ ) ans ^= i;
edtime = chrono::system_clock::now().time_since_epoch().count();
cout << ans << ' ' << edtime - sttime << '\n';
return 0;
}

第一次:10000000 8881985

第二次:10000000 9048101

第三次:10000000 8922749

测试总结

总结:别用 rand() 了(