2022年10月1日土曜日

ズンドコを判定する関数を作った

 先日アップした記事でズンドコキヨシをデータステップで作成した。その時は関数化まではしていなかったが、やはり元ネタに則り関数化までせねばならないと使命感に駆られてしまった。このクソ忙しい時に何をやっているのだろうか。実は私は暇だったのかもしれない。本当か?

お題が「関数化」なのであえてマクロではなくfcmpで関数を定義している。fcmp自体触ったことが無かったので随分と苦戦した。特にfcmpでのarrayはデータステップでのarrayとそのまま同じではないことを初めて知った。まだ二つの違いを理解できていないので難儀なもんである。sasも奥が深い。その違いによるものかは分からないが、乱数で0をズン、1をドコに割り当てたかったが既に数字として定義されているのでarrayの中で文字変数を作れなかったため、やむなく0/1のまま処理をしている。00001がズンズンズンズンドコにあたるので、その場合にキヨシが発生したとみなしている。

ややうまくいかないところがあったが、何はともあれfcmpを使った関数化には成功したので思う存分ズンドコキヨシを判定することができる。多分動くからリリースしようぜとは昔の偉い人もよく言ったものである。関数の出力はズンドコした回数だけにしているのでlogに過度に出力されることもなく、プログラムにこっそり混ぜていてもログが大惨事になることは無い。さあletsズンドコ。この記事が弊社にバレないことを祈る。

/*warning回避用*/

options cmplib = work.piyo ;


proc fcmp outlib = work.hoge.func ;

    function kiyoshi() $40 ;


        __n = 0 ;

        do until (cats(of temp1 - temp5) = "00001") ;


            __n + 1 ;

            /*任意の範囲の乱数を発生させるにはint((上限-下限+1)*乱数+下限)*/

            /*今回は0か1の2値が欲しいので上限=1,下限=0*/

            /*01の乱数をズンとドコに割り当てたかったがうまくいかないので01のままにしている*/

            array ch[5] temp1 - temp5 ;

            do i = 1 to dim(ch) ;

                ch[i] = int( 2*rand("uniform") ) ;

            end ;   


        end ;


        length V_RET $40 ;

        V_RET = cats(__n , "回ズンドコしました") ;


        return(V_RET) ;


    endsub ;

run ;



options cmplib = work.hoge ;

data _null_ ;

    HOGE = kiyoshi() ;

    putlog HOGE ;

run ;


/*実行例*/


880  options cmplib = work.hoge ;

881  data _null_ ;

882      HOGE = kiyoshi() ;

883      putlog HOGE ;

884  run ;


19回ズンドコしました

NOTE: DATAステートメント処理(合計処理時間):

      処理時間           0.04 秒

      CPU時間            0.04 秒


0 件のコメント:

コメントを投稿