Zgragselus

Random number generation - PDF

Oct 11th, 2025
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdint.h>
  3. #include <time.h>
  4. #include <mutex>
  5. #include <thread>
  6. #include <atomic>
  7. #include <random>
  8.  
  9. uint32_t BUCKETS = 1024;
  10. uint32_t MC_SAMPLES = 262144 * 32;
  11. uint32_t THREADS = std::thread::hardware_concurrency();
  12. uint32_t ITERATIONS = 255;
  13. uint32_t ITERATION = 0;
  14. std::atomic<uint32_t>** array;
  15.  
  16. uint32_t random(uint64_t* seed)
  17. {
  18.     return (*seed += *seed * *seed | 5) >> 32;
  19. }
  20.  
  21. uint32_t get_bucket_from_key(uint32_t key)
  22. {
  23.     return key % BUCKETS;
  24. }
  25.  
  26. void thread_func()
  27. {
  28.     uint64_t seed;
  29.  
  30.     // Get merseene twister random here
  31.     std::random_device dev;
  32.     std::mt19937 rng(dev());
  33.     seed = rng();
  34.  
  35.     for (uint32_t i = 0; i < MC_SAMPLES; i++)
  36.     {
  37.         uint32_t index;
  38.         uint32_t value;
  39.         value = random(&seed);
  40.         array[ITERATION][get_bucket_from_key(value)]++;
  41.     }
  42. }
  43.  
  44. int main()
  45. {
  46.     array = new std::atomic<uint32_t>*[ITERATIONS];
  47.     for (uint32_t i = 0; i < ITERATIONS; i++)
  48.     {
  49.         array[i] = new std::atomic<uint32_t>[BUCKETS];
  50.         for (uint32_t j = 0; j < BUCKETS; j++)
  51.         {
  52.             array[i][j] = 0;
  53.         }
  54.     }
  55.  
  56.     for (size_t iter = 0; iter < ITERATIONS; iter++)
  57.     {
  58.         ITERATION = iter;
  59.  
  60.         // Launch threads to fill array
  61.         std::thread* threads = new std::thread[THREADS];
  62.         for (uint32_t i = 0; i < THREADS; i++)
  63.         {
  64.             threads[i] = std::thread(thread_func);
  65.         }
  66.         for (uint32_t i = 0; i < THREADS; i++)
  67.         {
  68.             threads[i].join();
  69.         }
  70.  
  71.         // Normalize number in array to 0 - 255
  72.         uint32_t max = 0;
  73.         for (uint32_t i = 0; i < BUCKETS; i++)
  74.         {
  75.             if (array[iter][i] > max)
  76.             {
  77.                 max = array[iter][i];
  78.             }
  79.         }
  80.  
  81.         for (uint32_t i = 0; i < BUCKETS; i++)
  82.         {
  83.             array[iter][i] = (array[iter][i] * 255) / max;
  84.         }
  85.  
  86.         printf("Iteration %d/%d done\n", iter + 1, ITERATIONS);
  87.     }
  88.  
  89.     // Write ppm file to visualize the result
  90.     FILE* f;
  91.     fopen_s(&f, "result.ppm", "wb");
  92.     fprintf(f, "P6\n%d %d\n255\n", BUCKETS, 256);
  93.     for (uint32_t y = 0; y < 256; y++)
  94.     {
  95.         for (uint32_t x = 0; x < BUCKETS; x++)
  96.         {
  97.             uint8_t color = 0;
  98.             for (uint32_t i = 0; i < ITERATIONS; i++)
  99.             {
  100.                 if (array[i][x] <= (255 - y))
  101.                 {
  102.                     color++;
  103.                 }
  104.             }
  105.             fwrite(&color, 1, 1, f);
  106.             fwrite(&color, 1, 1, f);
  107.             fwrite(&color, 1, 1, f);
  108.         }
  109.     }
  110.     fclose(f);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment