random function

Author: bignonj@gmail.com (Bignon)

Hi,

 

How to get a random function in Uniface 7206 ?

 

Thanks again.

 

Jérôme

8 Comments

  1. Hi jerome,

    the dITo 3gl toolbox provides (among others) this feature.

    See www.uli-merkel.de/dito on SITEMAP look for:

    "3TB 3GL Toolbox"

    Success, Uli


    Author: ulrich-merkel (ulrichmerkel@web.de)
  2. An alternative to the solution offered by Uli is to program a so called "linear congruential generator" in Uniface proc. For example:

    variables
       numeric Aa, Cee, Em, Xn, Pee
    endvariables
    Xn  = $clock[15:2] ;Random seed
    Em  = $power(2,32)
    Aa  = 22695477
    Cee = 1

    ...
    while (...)
       Xn = (Aa*Xn+Cee)%Em ;Linear Congruential Generator
       Pee  = Xn /(Em-1)     ;Uniformly distributed on [0,1]
       ...
    endwhile

    Hans de Vos, Grontmij

     


    Author: p012866 (hans.devos@grontmij.nl)
  3. Hi Hans,

    yes, implementing a complete random generator in uniface is an alternative.

    Thanks for sharing your code with us.

    Some functions have changed it's name in between, so
    If one wants to code it in version 7:  use power instead of $power

    Success, Uli


    Author: ulrich-merkel (ulrichmerkel@web.de)
  4. Hi Jérôme

    Long time ago, I wrote this procedure on the algorithm by Park&Mille

    Ingo

     

    ;
    ;ENTRY  GP_RANDOM
    ;
    ; Zufallszahlen von 0 bis unterhalb v_MAX  erzeuzgen
    ;
     params
       numeric v_MAX    :IN
       numeric v_VALUE    :OUT ; erzeugte Zufallszahl
     endparams
     variables
       numeric v_VALUE2
     endvariables
      call LP_RANDOM(v_VALUE2)
      v_VALUE=v_MAX*v_VALUE2
      v_VALUE=v_VALUE[trunc]
      IF (v_VALUE=v_MAX) v_VALUE=0; Falls $RANDOM$ genau auf 1 stehen sollte
      ;putmess "Zufall[%%v_MAX] = %%v_VALUE"
    RETURN(0)

    ENTRY LP_RANDOM
     ; Nach Park and Miller in ACM June 1988 v32 #6
     ; http://www.unix-ag.uni-kl.de/~conrad/krypto/misc/prng.html
     params
       numeric v_VALUE:OUT
     endparams
     IF($$X_RAND_SEED=""|$$X_RAND_SEED<1)
       call LP_RANDOM_INIT
     ENDIF
     call LP_RANDOM2(v_VALUE)
    RETURN(0)
     
    ENTRY LP_RANDOM2
      params
        numeric v_VALUE:OUT
      endparams
      variables
        numeric v_A
        numeric v_M
        numeric v_Q
        numeric v_R
        numeric v_HI
        numeric v_LO
        numeric v_TEST
      endvariables
      v_A=16807       ;a
      v_M=2147483647  ;m
      v_Q=127773      ;q v_M DIV v_A
      V_R=2836        ;r v_M MOD v_A

      IF ($$X_RAND_SEED<1) $$X_RAND_SEED=1
      $$X_RAND_SEED=$$X_RAND_SEED[trunc]
      v_HI= $$X_RAND_SEED/v_Q    ;hi
      v_LO= $$X_RAND_SEED%v_Q    ;lo
      v_TEST= v_A*v_LO-v_R*v_HI    ;test
      IF (v_TEST>0)
        $$X_RAND_SEED=v_TEST
      ELSE
        $$X_RAND_SEED=v_TEST+v_M
      ENDIF
       v_VALUE=$$X_RAND_SEED/v_M
    RETURN(0);LP_RANDOM2


    ENTRY LP_RANDOM_INIT
      variables
        numeric v_SEED
        numeric v_SEK
      endvariables
      v_SEED=$time ; Dummerweise nur auf Sekundenbasis
      v_SEED=v_SEED[fraction]
      v_SEED=v_SEED*1000000
      v_SEED=v_SEED[trunc]
      v_SEK=v_SEED%10
      v_SEED=v_SEED+v_SEK*100+v_SEK*10000
      $$X_RAND_SEED=v_SEED
      WHILE(v_SEK>0)
        v_SEK=v_SEK-1
        call LP_RANDOM2(0)
      ENDWHILE
    RETURN(0)


    Author: istiller (i2stiller@gmx.de)
  5. Thanks to all, I have yet to implement the solution but I'll let you know ! Remains to convince the functional office ;-)

    Thanks !

     


    Author: Bignon (bignonj@gmail.com)
  6. I would like to see this as well -- currently, I call an Oracle procedure to perform this function but would rather do a call native to Uniface.


    Author: hoss (adkinsl@proware.com)
  7. Random ... so often needed and not available :)

     

    Yes, i would like to see this too. Doing web demands some randomizing here and there (e.g. for download-codes, activation stuff and so on).

     

    Nice features could be:

    • Param for "numeric" or "alpha" with default alphanumeric
    • length of string
    • optional params : Chars has to be [UPPERCASE|LOWERCASE|WITHOUT CHAR XYZ]
    • $proc in order to get the results directly (e.g. vRandom = $random('alpha',8,"UPPERCASE") )

    Any other ideas!?

     

    Cheers,

     

    -GHAN-


    Author: -GHAN- (hansen@ahp-gmbh.de)
  8. The dIToBox provides a random functionality.

    Please have a look at it.

    Success, Uli


    Author: ulrich-merkel (ulrichmerkel@web.de)