Learn from sources
       Member XXXRANDOM in CGIDEV2 / QRPGLESRC

       **************************************************************************
       * This material is provided by IBM for illustrative purposes             *
       * only and has not been thoroughly tested under all conditions.          *
       * IBM, therefore, cannot guarantee or imply reliability,                 *
       * serviceability, or function of this material.  IBM provides            *
       * no program services for this material.  All material contained         *
       * herein is provided to you "AS IS" without any warranties of            *
       * any kind.  THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS          *
       * FOR A PARTICULAR PURPOSE AND NON-INFRINGMENT ARE EXPRESSLY             *
       * DISCLAIMED.  SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION             *
       * OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSIONS MAY NOT APPLY           *
       * TO YOU.  IN NO EVENT WILL IBM BE LIABLE TO ANY PARTY FOR ANY           *
       * DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR           *
       * ANY USE OF THIS MATERIAL, INCLUDING, WITHOUT LIMITATION, ANY           *
       * LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER         *
       * DATA ON YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN            *
       * IF WE ARE EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.        *
       *                                                                        *
       * (C) Copyright IBM Corp. 1997, 2006                                     *
       * All rights reserved.                                                   *
       * US Government Users Restricted Rights -                                *
       * Use, duplication, or disclosure restricted                             *
       * by GSA ADP Schedule Contract with IBM Corp.                            *
       *                                                                        *
       * Licensed Materials - Property of IBM                                   *
       **************************************************************************
      Hnomain
       /copy qrpglesrc,hspecs
 
       /copy qrpglesrc,prototypeb
 
       /copy qrpglesrc,usec
 
       * Program status data structure
      Dpsds            sds
      D  psdsdata                    429
 
       * Prototype for Generate Pseudorandom Numbers
      D GenPRN          pr                  extproc('Qc3GenPRNs')
      D  PRNdata                        *   value
      D  PRNlength                    10u 0 const
      D  PRNtype                       1    const
      D  PRNparity                     1    const
      D  ErrorCode                          like(qusec)
 
       ***********************************************************************
       * Random subprocedure
       ***********************************************************************
       * Returns a random unsigned integer between low and high.
       *
       * Inputs:  low end of range.  Min=1 Max=maxrange
       *          high end of range  Min=2 Max=maxrange + 1
       *          difference must be at least 2
       * Maxrange is a constant, 2147483646, defined in module xxxrandom
       *
       * Uses CEERAN0.  On first call, sets seed to 0 so that CEERAN0 uses GMT.
       * On subsequent calls, uses seed as modified by previous calls to CEERAN0.
       *
       * Exceptions:
       *          If (abs(high - low) < 2) or (abs(high - low) > maxrange + 1)
       *             then range is changed to 1 to (maxrange + 1)
      Prandom           b                   export
      Drandom           pi            10u 0                                      Random number
      D  low                          10u 0 value                                Low end of range
      D  high                         10u 0 value                                High end of range
      Drange            s             10u 0
      Dseed             s             10u 0 static inz(0)
      Dswap             s             10u 0                                      For swapping
      Dmaxrange         c                   2147483646
      Dworkfloat        s              8f
      Dmax8             s             20u 0 inz(*hival)
      Dworkdata         s             20u 0
       ****************************************************************************
       * Subprocedure logic
       ****************************************************************************
       * Swap low and high if low > high
      C                   if        low > high
      C                   eval      swap = low
      C                   eval      low = high
      C                   eval      high = swap
      C                   endif
       * If low less than 0 or greater than maxrange, change it to 1
      C                   if        low < 0 or low > maxrange
      C                   eval      low = 1
      C                   endif
       * If high greater than maxrange + 1 or less than 2, change it to maxrange + 1
      C                   if        high > (maxrange + 1) or high < 2
      C                   eval      high = maxrange + 1
      C                   endif
       * If high and low are equal, change them to 1 and maxrange + 1
      C                   if        high = low
      C                   eval      low = 1
      C                   eval      high = maxrange + 1
      C                   endif
       * Calculate the range
      C                   eval      range = high - low + 1
       * Generate random number.
      C                   callp     GenPRN(%addr(workdata):%size(workdata):
      C                                    '0':'0':qusec)
      C                   eval      workfloat = workdata / max8
       * Return random number
      C                   return    %uns(workfloat * range) + low
 
       ***********************************************************************
      C     *pssr         begsr
       ***********************************************************************
       * Program status subroutine
      C                   callp     wrtpsds(psds)
      C                   endsr
 
      P random          e
 
       ***********************************************************************
       * RandomString subprocedure
       ***********************************************************************
       * Returns a random, varying length string up to 1024 characters
       * in length.
       * You can select its format as shown below.  The characters
       * used are 0 - 9, a - z, and A - Z.
       *
       * Parameters
 
       *  - Number of characters to return (0 - 1024)
       *    If 0, a null string is returned.
       *    If > 1024, 1024 characters are returned.
 
       *  - First character (if not passed, defaults to *mixedDigit)
       *    - *upperLetter (upper case letter only)
       *    - *lowerLetter (lower case letter only)
       *    - *mixedLetter (upper or lower case letter only)
       *    - *upperDigit (upper case letter or digit)
       *    - *lowerDigit (lower case letter or digit)
       *    - *mixedDigit (upper or lower case letter or digit)
       *    - *digit (digit only)
 
       *  - Remaining characters (if not passed, defaults to *mixedDigit)
       *    - same choices as first character
 
       *  - UpperChars - characters that are "upper case")
       *    - If not passed or has length = 0,
       *      defaults to 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
       *  - LowerChars - characters that are "lower case")
       *    - If not passed or has length = 0,
       *      defaults to 'abcdefghijklmnopqrstuvwzyz'
 
       *  - DigitChars - characters that are "digits")
       *    - If not passed or has length = 0, defaults to '0123456789'
       *    -
       * Returns
       *  - Varying string containing the random characters
 
      P randomString    b                   export
      D randomString    pi          1024    varying
      D  length                       10u 0 value
      D  firstChar                    12    value options(*nopass)
      D  remainChar                   12    value options(*nopass)
      D  UpperChars                  100    value varying options(*nopass)
      D  LowerChars                  100    value varying options(*nopass)
      D  DigitChars                  100    value varying options(*nopass)
 
      D Digits          s            100    varying inz('0123456789')
      D Upper           s            100    varying
      D                                     inz('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
      D Lower           s            100    varying
      D                                     inz('abcdefghijklmnopqrstuvwxyz')
      D remainCharX     s                   like(remainChar)
      D firstCharX      s                   like(firstChar)
 
      D Test1           s            110    varying
      D Test2           s            110    varying
      D TheName         s           1024    varying
      D i               s             10i 0
      D r               s             10i 0 dim(4)
 
       ****************************************************************************
       * Subprocedure logic
       ****************************************************************************
       * Handle length = 0 or length > 1024
      C                   if        length = 0
      C                   return    ''
      C                   endif
      C                   if        length > 1024
      C                   eval      length = 1024
      C                   endif
 
       * Handle unpassed parms
      C                   if        %parms = 6 and %len(digitChars) > 0
      C                   eval      Digits = digitChars
      C                   endif
      C                   if        %parms >= 5 and %len(lowerChars) > 0
      C                   eval      Lower = lowerChars
      C                   endif
      C                   if        %parms >= 4 and %len(upperChars) > 0
      C                   eval      Upper = upperChars
      C                   endif
      C                   if        %parms >= 3
      C                   eval      remainCharX= uppify(remainChar)
      C                   endif
      C                   if        %parms >= 2
      C                   eval      firstCharX = uppify(firstChar)
      C                   endif
      C
       * Set up test1 and test 2 to contain the valid characters
       * for first character and remaining characters, respectively
      C                   select
      C                   when      firstCharX = '*UPPERLETTER'
      C                   eval      test1 = Upper
      C                   when      firstCharX = '*LOWERLETTER'
      C                   eval      test1 = Lower
      C                   when      firstCharX = '*MIXEDLETTER'
      C                   eval      test1 = Upper + Lower
      C                   when      firstCharX = '*UPPERDIGIT'
      C                   eval      test1 = Upper + Digits
      C                   when      firstCharX = '*LOWERDIGIT'
      C                   eval      test1 = Lower + Digits
      C                   when      firstCharX = '*MIXEDDIGIT'
      C                   eval      test1 = Upper + Lower + Digits
      C                   when      firstCharX = '*DIGIT'
      C                   eval      test1 =  Digits
      C                   other
      C                   eval      test1 = Digits + Upper + Lower
      C                   endsl
      C                   select
      C                   when      remaincharX = '*UPPERLETTER'
      C                   eval      test2 = Upper
      C                   when      remaincharX = '*LOWERLETTER'
      C                   eval      test2 = Lower
      C                   when      remaincharX = '*MIXEDLETTER'
      C                   eval      test2 = Upper + Lower
      C                   when      remaincharX = '*UPPERDIGIT'
      C                   eval      test2 = Upper + Digits
      C                   when      remaincharX = '*LOWERDIGIT'
      C                   eval      test2 = Lower + Digits
      C                   when      remaincharX = '*MIXEDDIGIT'
      C                   eval      test2 = Upper + Lower + Digits
      C                   when      remaincharX = '*DIGIT'
      C                   eval      test2 =  Digits
      C                   other
      C                   eval      test2 = Digits + Upper + Lower
      C                   endsl
       * First character
      C                   eval      TheName =
      C                             %subst(Test1:random(1:%len(test1)):1)
       * Remaining characters
      C                   for       i = 2 to length
      C                   eval      TheName = TheName +
      C                             %subst(Test2:random(1:%len(test2)):1)
      C                   endfor
       * Return result
      C                   return    TheName
 
       ***********************************************************************
      C     *pssr         begsr
       ***********************************************************************
       * Program status subroutine
      C                   callp     wrtpsds(psds)
      C                   endsr
 
      P RandomString    e
0.039 sec.s