![](/img/trans.png)
[英]What is the difference in uniform_int_distribution <> and <int>?
[英]What are the advantages of using uniform_int_distribution vs a modulus operation?
根據以下結果,使用%
operation生成兩個數之間的均勻隨機整數幾乎比使用std::uniform_int_distribution
快3倍:有沒有充分的理由使用std::uniform_int_distribution
?
碼:
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
#include <random>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define N 100000000
int main()
{
clock_t tic,toc;
for(int trials=0; trials<3; trials++)
{
cout<<"trial: "<<trials<<endl;
// uniform_int_distribution
{
int res = 0;
mt19937 gen(1);
uniform_int_distribution<int> dist(0,999);
tic = clock();
for(int i=0; i<N; i++)
{
int r = dist(gen);
res += r;
res %= 1000;
}
toc = clock();
cout << "uniform_int_distribution: "<<(float)(toc-tic)/CLOCKS_PER_SEC << endl;
cout<<res<<" "<<endl;
}
// simple modulus operation
{
int res = 0;
mt19937 gen(1);
tic = clock();
for(int i=0; i<N; i++)
{
int r = gen()%1000;
res += r;
res %= 1000;
}
toc = clock();
cout << "simple modulus operation: "<<(float)(toc-tic)/CLOCKS_PER_SEC << endl;
cout<<res<<" "<<endl;
}
cout<<endl;
}
}
輸出:
trial: 0
uniform_int_distribution: 2.90289
538
simple modulus operation: 1.0232
575
trial: 1
uniform_int_distribution: 2.86416
538
simple modulus operation: 1.01866
575
trial: 2
uniform_int_distribution: 2.94309
538
simple modulus operation: 1.01809
575
當您使用modulo( %
)將范圍(例如rand()
映射到另一個區間時,您將獲得統計偏差 。
例如假設rand()
映射均勻地(不偏置)至[0, 32767]
和要映射到[0,4]
做rand() % 5
。 那么值0,1和2平均將在32768次中產生6554,但值3和4僅產生6553次(因此3 * 6554 + 2 * 6553 = 32768)。
偏差很小(0.01%),但取決於您的應用可能會致命。 觀看Stephan T. Lavavej的談話“ rand()被認為是有害的 ”了解更多細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.