OpenEdge Random Number Generator - Forum - OpenEdge General - Progress Community

OpenEdge Random Number Generator

 Forum

OpenEdge Random Number Generator

  • Do we have any function which would randomly generate a number between a range such as 1 & 100. The Random function gives a random number between 1 & 100 but the problem is, it repeats the same value again so it doesn't always return a new value between 1 & 100.

  • The RANDOM() function can take a range. Also look at the -rand startup parameter for details on how to control the number reuse.

    -- peter

  • I checked the RANDOM function and the -rand startup parameter but it seems there is no way by which we can prevent the same number selected again randomly in the same session using either of the random number generators.

  • roll your own then..

  • define var number# as integer no-undo.

    define var ok# as logical no-undo,

    define temp-table ttrandom

        field randnumber as integer 

        index ttindex as primary unique

        randnumber.

    empty temp-table ttrandom.

    ASSIGN

         Number# = random (whatever you want).

         ok# = false.

    find first ttrandom where

        Ttrandom.randnumber = number#

        no-lock no-error.

    if not avail ttrandom then

    do:

        create ttrandom.

        Ttrandom.randnumber = number#.

        ok# = true. 

        <>

    end.

    use this for idea not verbatim - change the while not ok# loop to suit your needs.

  • if you specify the -rand 2 client startup parameter, then a different random number generator is used. This 32-bit linear congruential generator is seeded with a different value for each session. The default random number generator is seeded with the same value each session by design.

  • This is not a good solution.

    If you need to implement a random number generator, go find some suitable proven algorithm and use that. It is quite difficult to implement a good random number generator and trial and error will never get you there.

  • If he wants to guarantee uniqueness, then yes this will work.

    If he wants a better algorithm, then yes find a nifty snazzy algorithm.

  • I tried using -rand 2, still the problem I am facing is the same number is generated twice or more than that in the same session ideally I need to generate a random number which doesn't repeat in the same session.

  • I suspect that you should be looking at guid(generate-uuid) rather than random

    On 30 January 2013 09:51, Ramalingam Veerakumararajan

  • I need the random number between a lower and an upper limit number

  • All right then. Here is some code that gives you the numbers from 1 to 100 in random order.

    def var i as int no-undo.

    def var r as int no-undo.

    def var t as int no-undo.

    def var n as int extent 100 no-undo.

    /* make a list of 100 numbers */

    do i = 1 to 100:

        n[i] = i.

    end.

    /* scramble the list */

    do i = 100 to 2 by -1:

        r = random (1, i).

        if (r = i) then next.

        t = n[i].

        n[i] = n[r].

        n[r] = t.

    end.

    /* do something with the numbers */

    do i = 1 to 100:

        . . . .

    end.

  • This should work in 10.2A+:

    DEF VAR oRandom AS System.Random.

    oRandom = NEW System.Random().
    MESSAGE oRandom:Next(1,100).

    DELETE OBJECT oRandom.

    Edit: sorry, I didn't read carefully, you wanted to prevent using the same value twice. I guess this won't work any better that RANDOM function.

  • I think he mean that two different runs of his application produce the same series of random numbers.

    Based on the documentation of System.Random() it uses the system clock as the seed, so it should give different series of random numbers each application run.

  • Let's start over. I will try to be precise in restating the problem.

    As I understand it, what you need is a series of up to 100 number values such that:

    • each number is an integer in the range 1 to 100 inclusive
    • each number in the series occurs only once
    • the numbers are in a "random" order

    is that correct? Are there any other requirements ?