星期二, 10月 31, 2023

2000-05-12 如何於 RPG IV 中產生亂數 ? (RANDOM NUMBER GENERATORS)



如何於 RPG IV 中產生亂數 ? (RANDOM NUMBER GENERATORS)

════════════════════════════════

易 經

乾為天卦 上乾下乾

釋 :偉大的天,為君的道。(旱象逢河之象)

初九:在潛伏時期,應當隱忍時機,不可妄動。
九二:當偉大人物顯現時,給天下帶來生機與希望,有作為的人,
      應當擁護與支持,同時本身也應當接近群眾,結合有作為的同志。
九三:在成長時期,羽毛未豐,應當奮發努力,但必須戒慎恐懼,以防災禍。
九四:已經到了躍躍欲試的試鍊階段,決定進退應當把握最有利的時機。
九五:已經到了大展鴻圖的極盛時期,應當選賢與能,賢能也應當支持擁護。
上九:盛極而衰,是大自然的法則,應當警惕與節制。

════════════════════════════════

□ Tips :  如何於 RPG IV 中產生亂數  ? (RANDOM NUMBER GENERATORS)

--------------------------------
1. RPG IV 中有 API  CEERAN0 亂數產生器, 此 API 
   A.  接收種子參數 C0Seed 介於 0 - 2,147,483,646 ; 若設 0 , 則
       系統會自動截取系統格林威治時間當種子參數。
   B.  輸出 C0RndNbr 亂數, 是 64-bit 雙倍浮點數字,輸出值
       介於 0 - 1 間, 若 Call API CEERAN0 有問題, 則傳回 -1。
2. 利用迴圈及 %DecH Built-In 函數, 將C0RndNbr 亂數輸出值轉換成
   PACKED 數字

--------------------------------
QRPGLESRC -- RANDOM   RPGLE
             CRTBNDPGM  PGM(RANDOM)  DFTACTGRP(*NO)

     D C0Seed          S              5I 0 Inz(0)                      
     D C0RndNbr        S              8F                               
      **-- Random Number Conversion:  ---------------------------------
     D RndNbr          S             10I 0                             
     D MaxNbr          S             10I 0 Inz(9000000)                
     D MinNbr          S             10I 0 Inz(1000000)                
     D TempChr         S             20                                
      **                                                               
                                                                       
     **================================================================
      **                                                               
     C                   DoU       RndNbr >= MinNbr                    
      **                                                               
     C                   CallB     'CEERAN0'                           
     C                   Parm                    C0Seed                
     C                   Parm                    C0RndNbr              
     C                   Parm                    *OMIT                 
     **                                                                
     C                   Eval      RndNbr = %DecH(C0RndNbr:30:29) * MaxNbr
     C                   EndDo                                         
      **                                                               
     C                   Eval      TempChr = %CHAR(RndNbr)             
     C     TempChr       Dsply                                         
      **                                                               
     C                   Return                                        


沒有留言: