• Re: Cobol random number generator

    From shantheri shenoy@21:1/5 to dens...@gmail.com on Wed Jan 18 01:39:30 2023
    On Sunday, February 22, 2015 at 12:30:12 PM UTC+5:30, dens...@gmail.com wrote:
    On Friday, July 11, 2003 at 12:51:41 PM UTC-5, Guy wrote:
    Does anyone have a random number generator for Cobol that they would
    be willing to share?
    I updated the code to fix some after midnight problems and other problems. Sorry for the first set of code. But have not found a way to delete it from forum.
    IDENTIFICATION DIVISION.
    PROGRAM-ID. RANDGEN as "ConsoleApplication2.RANDGEN".
    AUTHOR. Myron D Denson.
    DATE-COMPILED.
    * **************************************************************
    * SUBROUTINE TO GENERATE RANDOM NUMBERS THAT ARE GREATER THAN
    * ZERO AND LESS OR EQUAL TO THE RANDOM NUMBERS NEEDED WITH NO
    * DUPLICATIONS. (CALL "RANDGEN" USING RANDGEN-AREA.)
    *
    * CALLING PROGRAM MUST HAVE A COMPARABLE LINKAGE SECTION
    * AND SET 3 VARIABLES PRIOR TO THE FIRST CALL IN RANDGEN-AREA
    *
    * FORMULA CYCLES THROUGH EVERY NUMBER OF 2X2 ONLY ONCE.
    * RANDOM-NUMBERS FROM 1 TO RANDOM-NUMBERS-NEEDED ARE CREATED
    * AND PASSED BACK TO YOU.
    *
    * RULES TO USE RANDGEN:
    *
    * RANDOM-NUMBERS-NEEDED > ZERO
    *
    * COUNT-OF-ACCESSES MUST = ZERO FIRST TIME CALLED.
    *
    * RANDOM-NUMBER = ZERO, WILL BUILD A SEED FOR YOU
    * WHEN COUNT-OF-ACCESSES IS ALSO = 0
    *
    * RANDOM-NUMBER NOT = ZERO, WILL BE NEXT SEED FOR RANDGEN
    * (RANDOM-NUMBER MUST BE <= RANDOM-NUMBERS-NEEDED)
    *
    * YOU CAN PASS RANDGEN YOUR OWN RANDOM-NUMBER SEED
    * THE FIRST TIME YOU USE RANDGEN.
    *
    * BY PLACING A NUMBER IN RANDOM-NUMBER FIELD
    * THAT FOLLOWES THESE SIMPLE RULES:
    * IF COUNT-OF-ACCESSES = ZERO AND
    * RANDOM-NUMBER > ZERO AND
    * RANDOM-NUMBER <= RANDOM-NUMBERS-NEEDED
    *
    * YOU CAN LET RANDGEN BUILD A SEED FOR YOU
    *
    * THAT FOLLOWES THESE SIMPLE RULES:
    * IF COUNT-OF-ACCESSES = ZERO AND
    * RANDOM-NUMBER = ZERO AND
    * RANDOM-NUMBER-NEEDED > ZERO
    *
    * TO INSURING A DIFFERENT PATTERN OF RANDOM NUMBERS
    * A LOW-RANGE AND HIGH-RANGE IS USED TO BUILD
    * RANDOM NUMBERS.
    * COMPUTE LOW-RANGE =
    * ((SECONDS * HOURS * MINUTES * MS) / 3).
    * A HIGH-RANGE = RANDOM-NUMBERS-NEEDED + LOW-RANGE
    * AFTER RANDOM-NUMBER-BUILT IS CREATED
    * AND IS BETWEEN LOW AND HIGH RANGE
    * RANDUM-NUMBER = RANDOM-NUMBER-BUILT - LOW-RANGE
    *
    * **************************************************************
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
    DATA DIVISION.
    FILE SECTION.
    WORKING-STORAGE SECTION.
    01 WORK-AREA.
    05 X2-POWER PIC 9 VALUE 2.
    05 2X2 PIC 9(12) VALUE 2 COMP-3.
    05 RANDOM-NUMBER-BUILT PIC 9(12) COMP.
    05 FIRST-PART PIC 9(12) COMP.
    05 WORKING-NUMBER PIC 9(12) COMP.
    05 LOW-RANGE PIC 9(12) VALUE ZERO.
    05 HIGH-RANGE PIC 9(12) VALUE ZERO.
    05 YOU-PROVIDE-SEED PIC X VALUE SPACE.
    05 RUN-AGAIN PIC X VALUE SPACE.
    05 PAUSE-FOR-A-SECOND PIC X VALUE SPACE.
    01 SEED-TIME.
    05 HOURS PIC 99.
    05 MINUTES PIC 99.
    05 SECONDS PIC 99.
    05 MS PIC 99.
    *
    * LINKAGE SECTION.
    * Not used during testing
    01 RANDGEN-AREA.
    05 COUNT-OF-ACCESSES PIC 9(12) VALUE ZERO.
    05 RANDOM-NUMBERS-NEEDED PIC 9(12) VALUE ZERO.
    05 RANDOM-NUMBER PIC 9(12) VALUE ZERO.
    05 RANDOM-MSG PIC X(60) VALUE SPACE.
    *
    * PROCEDURE DIVISION USING RANDGEN-AREA.
    * Not used during testing
    *
    PROCEDURE DIVISION.
    100-RANDGEN-EDIT-HOUSEKEEPING.
    MOVE SPACE TO RANDOM-MSG.
    IF RANDOM-NUMBERS-NEEDED = ZERO
    DISPLAY 'RANDOM-NUMBERS-NEEDED ' NO ADVANCING
    ACCEPT RANDOM-NUMBERS-NEEDED.
    IF RANDOM-NUMBERS-NEEDED NOT NUMERIC
    MOVE 'RANDOM-NUMBERS-NEEDED NOT NUMERIC' TO RANDOM-MSG
    GO TO 900-EXIT-RANDGEN.
    IF RANDOM-NUMBERS-NEEDED = ZERO
    MOVE 'RANDOM-NUMBERS-NEEDED = ZERO' TO RANDOM-MSG
    GO TO 900-EXIT-RANDGEN.
    IF COUNT-OF-ACCESSES NOT NUMERIC
    MOVE 'COUNT-OF-ACCESSES NOT NUMERIC' TO RANDOM-MSG
    GO TO 900-EXIT-RANDGEN.
    IF COUNT-OF-ACCESSES GREATER THAN RANDOM-NUMBERS-NEEDED
    MOVE 'COUNT-OF-ACCESSES > THAT RANDOM-NUMBERS-NEEDED' TO RANDOM-MSG
    GO TO 900-EXIT-RANDGEN.
    IF YOU-PROVIDE-SEED = SPACE AND RANDOM-NUMBER = ZERO
    DISPLAY 'DO YOU WANT TO PROVIDE SEED Y OR N: '
    NO ADVANCING
    ACCEPT YOU-PROVIDE-SEED.
    IF RANDOM-NUMBER = ZERO AND
    (YOU-PROVIDE-SEED = 'Y' OR 'y')
    DISPLAY 'ENTER SEED ' NO ADVANCING
    ACCEPT RANDOM-NUMBER.
    IF RANDOM-NUMBER NOT NUMERIC
    MOVE 'RANDOM-NUMBER NOT NUMERIC' TO RANDOM-MSG
    GO TO 900-EXIT-RANDGEN.
    200-RANDGEN-DATA-HOUSEKEEPING.
    MOVE FUNCTION CURRENT-DATE (9:8) TO SEED-TIME.
    IF COUNT-OF-ACCESSES = ZERO
    COMPUTE LOW-RANGE =
    ((SECONDS + HOURS + MINUTES + MS) * 1753).
    COMPUTE RANDOM-NUMBER-BUILT = RANDOM-NUMBER + LOW-RANGE.
    COMPUTE HIGH-RANGE = RANDOM-NUMBERS-NEEDED + LOW-RANGE.
    MOVE X2-POWER TO 2X2.
    300-SET-2X2-DIVISOR.
    IF 2X2 < (HIGH-RANGE + 1)
    COMPUTE 2X2 = 2X2 * X2-POWER
    GO TO 300-SET-2X2-DIVISOR.
    * *********************************************************
    * IF FIRST TIME THROUGH AND YOU WANT TO BUILD A SEED. *
    * *********************************************************
    IF COUNT-OF-ACCESSES = ZERO AND RANDOM-NUMBER = ZERO
    COMPUTE RANDOM-NUMBER-BUILT =
    ((SECONDS + HOURS + MINUTES + MS) + HIGH-RANGE).
    IF COUNT-OF-ACCESSES = ZERO
    DISPLAY 'SEED TIME ' SEED-TIME
    ' RANDOM-NUMBER-BUILT ' RANDOM-NUMBER-BUILT
    ' LOW-RANGE ' LOW-RANGE.
    * *********************************************
    * END OF BUILDING A SEED IF YOU WANTED TO *
    * *********************************************
    * ***************************************************
    * THIS PROCESS IS WHERE THE RANDOM-NUMBER IS BUILT *
    * ***************************************************
    400-RANDGEN-FORMULA.
    COMPUTE FIRST-PART = (5 * RANDOM-NUMBER-BUILT) + 7.
    DIVIDE FIRST-PART BY 2X2 GIVING WORKING-NUMBER
    REMAINDER RANDOM-NUMBER-BUILT.
    IF RANDOM-NUMBER-BUILT > LOW-RANGE AND
    RANDOM-NUMBER-BUILT < (HIGH-RANGE + 1)
    GO TO 600-RANDGEN-CLEANUP.
    GO TO 400-RANDGEN-FORMULA.
    * *********************************************
    * GOOD RANDOM NUMBER HAS BEEN BUILT *
    * *********************************************
    600-RANDGEN-CLEANUP.
    ADD 1 TO COUNT-OF-ACCESSES.
    COMPUTE RANDOM-NUMBER =
    RANDOM-NUMBER-BUILT - LOW-RANGE.
    * *******************************************************
    * THE NEXT 3 LINE OF CODE ARE FOR TESTING ON CONSOLE *
    * *******************************************************
    DISPLAY RANDOM-NUMBER.
    IF COUNT-OF-ACCESSES < RANDOM-NUMBERS-NEEDED
    GO TO 100-RANDGEN-EDIT-HOUSEKEEPING.
    900-EXIT-RANDGEN.
    IF RANDOM-MSG NOT = SPACE
    DISPLAY 'RANDOM-MSG: ' RANDOM-MSG.
    MOVE ZERO TO COUNT-OF-ACCESSES RANDOM-NUMBERS-NEEDED RANDOM-NUMBER.
    MOVE SPACE TO YOU-PROVIDE-SEED RUN-AGAIN.
    DISPLAY 'RUN AGAIN Y OR N '
    NO ADVANCING.
    ACCEPT RUN-AGAIN.
    IF (RUN-AGAIN = 'Y' OR 'y')
    GO TO 100-RANDGEN-EDIT-HOUSEKEEPING.
    ACCEPT PAUSE-FOR-A-SECOND.
    GOBACK.
    sir could pls explain the program

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Bill Gunshannon@21:1/5 to shantheri shenoy on Wed Jan 18 08:42:53 2023
    On 1/18/23 04:39, shantheri shenoy wrote:
    * SUBROUTINE TO GENERATE RANDOM NUMBERS THAT ARE GREATER THAN
    * ZERO AND LESS OR EQUAL TO THE RANDOM NUMBERS NEEDED WITH NO
    * DUPLICATIONS. (CALL "RANDGEN" USING RANDGEN-AREA.)

    With this as a requirement the numbers can not be random. True
    random numbers can duplicate. In fact, a duplicate is just as
    random as a non-duplicate and just as possible.

    bill

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)