NE_SHALY

Untitled

Jan 19th, 2021
473
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>                                                                                                    
  3.                                                                                                                        
  4. #include <stdint.h>                                                                                                    
  5.                                                                                                                        
  6. typedef struct RandomOperations RandomOperations;                                                                      
  7.                                                                                                                        
  8. typedef struct RandomGenerator                                                                                          
  9. {                                                                                                                      
  10.     const RandomOperations* ops;                                                                                        
  11.                                                                                                                        
  12.     int64_t val;                                                                                                        
  13.                                                                                                                        
  14. } RandomGenerator;                                                                                                      
  15.                                                                                                                        
  16.                                                                                                                        
  17. typedef void ((*void_funcptr_t)(struct RandomGenerator *gen));                                                          
  18.                                                                                                                        
  19. typedef int ((*int_funcptr_t)(struct RandomGenerator *gen));                                                            
  20.                                                                                                                        
  21. typedef struct RandomOperations {                                                                                      
  22.     int_funcptr_t next;                                                                                                
  23.     void_funcptr_t destroy;                                                                                            
  24. } RandomOperations;                                                                                                    
  25.                                                                                                                        
  26. int next(RandomGenerator* gen) {                                                                                        
  27.     int64_t a = 1103515245, c = 12345, mod = 1 << 31;                                                                  
  28.     gen->val = (gen->val * a + c) % mod;                                                                                
  29.     return gen->val;                                                                                                    
  30. }                                                                                                                      
  31.                                                                                                                        
  32. void destroy(RandomGenerator* gen) {                                                                                    
  33.     free(gen);                                                                                                          
  34. }                                                                                                                      
  35.                                                                                                                        
  36. const RandomOperations ops = {next, destroy};                                                                          
  37.                                                                                                                        
  38. RandomGenerator* random_create(int seed) {                                                                              
  39.     RandomGenerator *gen = (RandomGenerator*)malloc(sizeof(RandomGenerator));                                          
  40.     gen->val = seed;                                                                                                    
  41.     gen->ops = &ops;                                                                                                    
  42.     return gen;                                                                                                        
  43. }                                                                                                                      
  44.                                                                                                                        
  45. int main() {                                                                                                            
  46.     RandomGenerator *rr = random_create(1234);                                                                          
  47.     for (int j = 0; j < 100; ++j) {                                                                                    
  48.       printf("%d\n", rr->ops->next(rr));                                                                                
  49.     }                                                                                                                  
  50.     rr->ops->destroy(rr);                                                                                              
  51.     return 0;                                                                                                          
  52. }                      
RAW Paste Data