Generating Random Numbers in ILE RPG Using the CEERAN0 API

Technote (troubleshooting)


Problem(Abstract)

ILE RPG has no native random number generator. An ILE-bindable API, CEERAN0, can be invoked from ILE RPG programs to generate such numbers. CEERAN0 takes as input an integer seed, which it updates each time to avoid repetitions in the random number sequence, and outputs a double precision random number (if given 0 as a seed, CEERAN0 will generate a random number based on the current system time).

Resolving the problem

ILE RPG has no native random number generator. An ILE-bindable API, CEERAN0, can be invoked from ILE RPG programs to generate such numbers. CEERAN0 takes as input an integer seed, which it updates each time to avoid repetitions in the random number sequence, and outputs a double precision random number (if given 0 as a seed, CEERAN0 will generate a random number based on the current system time).

The program sample in this document illustrates how to produce random numbers and store them into an output file.

ILE RPG Source Code

*                                                                                            
 * This file only contains one record, i.e. the seed value for the random number generator API,
 * CEERAN0.  The seed which CEERAN0 returns each time has to be kept and fed back to the API on
 * the next invocation: this is needed in order to avoid repeatedly generating the same random
 * number.                                                                                    
 *                                                                                            
Fseedpf    UF   E             DISK    USROPN                                                  
 *                                                                                            
 * This file contains the random numbers generated by the API.                                
 *                                                                                            
Frandpf    O    E             DISK    USROPN                                                  
 *                                                                                            
 * Number of random numbers to be generated during one run.                                    
 *                                                                                            
D Times           C                   const(1000)                                              
 *                                                                                            
 * Correction factor (see additional related comments in C specs).                            
 *                                                                                            
D Factor          C                   const(10000000000)                                      
 *                                                                                            
 * Definitions for standard data types.                                                        
 *                                                                                            
D StdPacked       S             15P 5                                      Packed              
D StdInt          S             10I 0                                      Integer            
D StdDouble       S              8F                                        Double Precision    
D StdFC           S             12A                                        Feedback Code      
 *                                                                                            
 * Prototype for random number generator API.                                                  
 *                                                                                            
D randnum_gen     PR                  extproc('CEERAN0')                                      
D Pr_seed                             LIKE(StdInt)                                            
D Pr_randnum                          LIKE(StdDouble)                                          
D Pr_FC                               LIKE(StdFC)                                              
 *                                                                                            
 *                                                                                            
 * Counter variable for looping.                                                              
 *                                                                                            
D counter         S                   LIKE(StdInt)                                            
 *                                                                                            
 * Variable to contain current seed value.                                                    
 *                                                                                            
D seednum         S                   LIKE(StdInt)                                            
 *                                                                                            
 * Variable to contain current random number.                                                  
 *                                                                                            
D randnum         S                   LIKE(StdDouble)                                          
 *                                                                                            
 * Variable to contain API's feedback code.                                                    
 *                                                                                            
D feedbackcode    S                   LIKE(StdFC)                                              
 *                                                                                            
 *                                                                                            
 *                                                                                            
 * Open input and output files.                                                                
 *                                                                                            
C                   open      seedpf                                                          
C                   open      randpf                                                          
 *                                                                                            
 * Read last seed value from previous run.                                                    
 *                                                                                            
C                   read      seedrec                                                          
 *                                                                                            
 * Set first seed value of this run to last seed value generated in the program's previous    
 * run.  The field "seedfld" is defined via DDS; when imported by the RPG compiler, the field  
 * comes in as packed(20,0) and has to be scaled by 10**10 before assigning it into seednum,  
 * which is integer(10,0).                                                                    
 *                                                                                            
C                   eval      seednum = %rem(seedfld:Factor)                                  
 *                                                                                            
 * Loop for the number of times previously specified.                                          
 *                                                                                            
C                   for       counter = 1 by 1 to Times                                        
 *                                                                                            
 * Generate random number, update seed value.                                                  
 *                                                                                            
C                   callp     randnum_gen(seednum:randnum:feedbackcode)                        
 *                                                                                            
 * Append new random number to the end of the output file.                                    
 *                                                                                            
C                   eval      randfld = randnum                                                
C                   write     randrec                                                          
C                   endfor                                                                    
 *                                                                                            
 * Set seed for next program run to last seed returned from the API.                          
 *                                                                                            
C                   eval      seedfld = seednum                                                
C                   update    seedrec                                                          
 *                                                                                            
 * Close input and output files.                                                              
 *                                                                                            
C                   close     randpf                                                          
C                   close     seedpf                                                          
C                   eval      *inlr = *on                                                      




DDS Source Code for Seed File

A          R SEEDREC            
     A            SEEDFLD       10B 0


DDS Source Code for Random Number File

 A          R RANDREC                                  
     A            RANDFLD       17F 7       FLTPCN(*DOUBLE)


Note: You need to add a record to the file SEEDPF. If you do not add a record, you will end up with message RNX1221 when you try to run the application. For example, add a record where SEEDFLD has a 0 (zero).

Historical Number

22835203

Rate this page:

(0 users)Average rating

Document information


More support for:

IBM i
Programming (Languages- compilers- tools)

Software version:

5.3.0, 5.3.5, 5.4.0, 5.4.5, 6.1.0, 7.1.0

Operating system(s):

IBM i

Reference #:

N1017440

Modified date:

2012-04-23

Translate my page

Machine Translation

Content navigation