Problem solve Get help with specific problems with your technologies, process and projects.

Random number generator -- and calling C functions from RPG

Ever get frustrated that you can't do certain things in RPG? Well you might like to check out the ILE C run-time library functions. Don't worry! You don't have to learn C and you don't even need a C compiler!

The ILE C library functions provide lots of useful utilities unavailable in RPG, such as complex math and random number generation. These functions are implemented in a set of service programs with names starting QC2..., e.g. QC2UTIL1 etc. These exist on your AS/400 even if you don't have C installed.

The program code below shows how to call these functions. The program will return a 4-byte integer containing a pseudo-random number between 1 and 32767. If passed a negative number, the random number generator will "re-seed" itself, i.e. start a new sequence of pseudo-random numbers.

To create the program, you need to compile the RPG code below as a module using the CRTRPGMOD command, then create the program binding in the C service program using:


 		* Prototype to C "rand" function                         
D GenRandNbr      PR            10I 0 ExtProc('rand')     
 * Prototype to C "srand" function                        
D SeedRand        PR                  ExtProc('srand')    
D   iuSeed                      10U 0 VALUE               
 * Prototype to C "clock" function                        
D GetTime         PR            10I 0 ExtProc('clock')    
 * Constants                                              
D TRUE            C                   '1'                 
D FALSE           C                   '1'                        
 * Global variables                                              
D RandomNumber    S             10I 0                            
D FirstTime       S              1A   INZ(TRUE)                  
D ClockTicks      S             10I 0                            
D SeedValue       S             10U 0                            
 * Program parameters                                            
C     *ENTRY        PLIST                                        
C                   PARM                    RandomNumber         
 * First time only or if parameter is negative                   
C                   IF           FirstTime = TRUE                 
C                             or RandomNumber < 0                 
 * Get clock "ticks" - if fails return error indicator            
C                   EVAL      ClockTicks = GetTime                
C                   IF        ClockTicks < 0                      
C                   EVAL      RandomNumber = -1                   
C                   RETURN                                        
C                   ENDIF                                         
 * Seed the random number generator                               
C                   EVAL      SeedValue = ClockTicks              
C                   CALLP     SeedRand(SeedValue)                 
C                   EVAL      FirstTime = FALSE               
C                   ENDIF                                     
 * Generate a random number                                   
C                   EVAL      RandomNumber = GenRandNbr       
C                   RETURN    

Dig Deeper on RPG iSeries programming

Start the conversation

Send me notifications when other members comment.

Please create a username to comment.