c++ - What are the advantages of using uniform_int_distribution vs a modulus operation? -


according following results, generating uniform random integers between 2 numbers using % operation 3 times faster using std::uniform_int_distribution: there reason use std::uniform_int_distribution?

code:

#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; }  } 

output:

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  

you statistical bias when use modulo (%) map range of e.g. rand() interval.

e.g suppose rand() maps uniformly (without bias) [0, 32767] , want map [0,4] doing rand() % 5. values 0, 1, , 2 on average produced 6554 out of 32768 times, values 3 , 4 6553 times (so 3 * 6554 + 2 * 6553 = 32768).

the bias small (0.01%) depending on application prove fatal. watch stephan t. lavavej's talk "rand() considered harmful" more details.


Comments

Popular posts from this blog

html - Outlook 2010 Anchor (url/address/link) -

javascript - Why does running this loop 9 times take 100x longer than running it 8 times? -

Getting gateway time-out Rails app with Nginx + Puma running on Digital Ocean -