Advertisement
NE_SHALY

Untitled

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