Advertisement
ceva_megamind

linear congruential generator (LCG)

Jan 9th, 2022
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. enum
  5. {
  6.     MUL = 1103515245,
  7.     INC = 12345,
  8.     MOD = 1u << 31
  9. };
  10.  
  11. typedef struct RandomGenerator
  12. {
  13.     unsigned mul, inc, mod;
  14.     unsigned elem;
  15.     const struct RandomOperations *ops;
  16. } RandomGenerator;
  17.  
  18. static int next(RandomGenerator *rr)
  19. {
  20.     if (rr == NULL) {
  21.         return 1;
  22.     }
  23.     unsigned res = 0;
  24.     if (__builtin_mul_overflow(rr->mul % rr-> mod, rr->elem % rr->mod, &res)) {
  25.         fprintf(stderr, "overflow\n");
  26.         return 1;
  27.     }
  28.     if (__builtin_add_overflow(res % rr->mod, rr->inc % rr->mod, &res)) {
  29.         fprintf(stderr, "overflow\n");
  30.         return 1;
  31.     }
  32.     rr->elem = res % rr->mod;
  33.     return rr->elem;
  34. }
  35.  
  36. static void destroy(RandomGenerator *rr)
  37. {
  38.     if (rr == NULL) {
  39.         return;
  40.     }
  41.     free(rr);
  42. }
  43.  
  44. typedef const struct RandomOperations
  45. {
  46.     void (*destroy) (RandomGenerator *rr);
  47.     int (*next) (RandomGenerator *rr);
  48. } RandomOperations;
  49.  
  50. static RandomOperations DefaultRandomOperations = {destroy, next};
  51.  
  52. RandomGenerator *random_create(int seed)
  53. {
  54.     RandomGenerator *generator = calloc(1, sizeof(*generator));
  55.     if (generator == NULL) {
  56.         return NULL;
  57.     }
  58.     generator->ops = &DefaultRandomOperations;
  59.     generator->mul = MUL;
  60.     generator->mod = MOD;
  61.     generator->inc = INC;
  62.     generator->elem = seed;
  63.     return generator;
  64. }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement