今天看到一个帖子求随机数用法,看到回复都在使用
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()
了(