Advertisement
xgallom

Random generator

Nov 20th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. void generate(uint32_t *to, uint32_t count, uint32_t x0, uint32_t a, uint32_t b, uint32_t m)
  4. {
  5.     to[0] = x0;
  6.  
  7.     for(uint32_t i = 1; i < count; ++i)
  8.         to[i] = (a * to[i - 1] + b) % m;
  9. }
  10.  
  11. void reduce(uint32_t *to, const uint32_t *from, uint32_t count, uint32_t categories)
  12. {
  13.     for(uint32_t i = 0; i < count; ++i)
  14.         to[i] = from[i] % categories;
  15. }
  16.  
  17. void reduceToNormal(double *to, const uint32_t *from, uint32_t count, uint32_t m)
  18. {
  19.     for(uint32_t i = 0; i < count; ++i)
  20.         to[i] = double(from[i]) / double(m);
  21. }
  22.  
  23. void count(uint32_t *to, const uint32_t *from, uint32_t n)
  24. {
  25.     for(uint32_t i = 0; i < n; ++i)
  26.         to[from[i]]++;
  27. }
  28.  
  29. void output(const uint32_t *data, uint32_t count)
  30. {
  31.     for(uint32_t i = 0; i < count; ++i)
  32.         std::cout << i << ": " << data[i] << "\n";
  33. }
  34.  
  35. void output(const double *data, uint32_t count)
  36. {
  37.     for(uint32_t i = 0; i < count; i += 3)
  38.         std::cout << i << ": " << data[i] << " " << data[i + 1] << " " << data[i + 2] << "\n";
  39. }
  40.  
  41. int main()
  42. {
  43.     const uint32_t
  44.             a = 1103515245u,
  45.             b = 12345u,
  46.             m = 1u << 31u, // 2^31
  47.             n = 27*3;
  48.  
  49.     uint32_t distribution[n];
  50.     double doubleResults[n];
  51.  
  52.     generate(distribution, n, 0, a, b, m);
  53.     reduceToNormal(doubleResults, distribution, n, m);
  54.     output(doubleResults, n);
  55.  
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement