Borrowing Rand from C

This program uses C modules listed in the QC2LE binding directory to generate random, or in this case semi-random numbers, since the first three digits of the number actually represent the day of the year. The time of day is used to seed the random number, the returned value is tested to determine if it has already been used. Binding to the C directory gives RPG some interesting functions to augment RPG op codes.

     H OPTION(*SRCSTMT : *NODEBUGIO) DFTACTGRP(*NO) ACTGRP('QILE')
     H BNDDIR('SOFTCODE':'QC2LE')

      ****************************************************************
      * PROGRAM NAME - ADM050RP                                      *
      *                                                              *
      * FUNCTION     - This program is bound to QC2LE to use the     *
      *                random number generator.                      *
      *                                                              *
      ****************************************************************
 
     FADMHDRPF  IF   E           K DISK

     *---
     /copy qrpglesrc,swcmmn_pr
     *---

     D ADM050RP        PR
     D OrderNbr                       8s 0

     D ADM050RP        PI
     D OrderNbr                       8s 0

     D c0Seed          S              5i 0  INZ(0)

     D GetRandomNbr    PR            10i 0 Extproc('rand')

     D SetRandom       PR                  ExtProc('srand')
     D  Seed                         10U 0 Value

     D randomNbr       S             10i 0
     D Today           S              8s 0
     D TimeOfDay       S              6s 0
     D DayNbr          S              3s 0

     D NewOrderNumber...
     D                 S               n

     **-- Random Number Conversion: ---------------------------------- **
     D MaxNbr          S             10i 0  INZ(000099999)
     D MinNbr          S             10i 0  INZ(000001000)
     **
      /free
          NewOrderNumber = *off;
          DOU NewOrderNumber;
            DoU randomNbr >= MinNbr AND randomNbr <= MaxNbr;
                Today = DateToday();
                DayNbr = DayOfYear();
                TimeOfDay = TimeNow();
                SetRandom(Today + TimeOfDay);
                randomNbr = GetRandomNbr();
            ENDDO;
          OrderNbr = (DayNbr * 100000) + randomNbr;
          CHAIN OrderNbr ADMHDRPF;
         IF not %found;
           NewOrderNumber = *on;
         ENDIF;
          ENDDO;
          RETURN;
      /end-free