- 締切済み
ランダム関数を作りたい。
COBOLでランダム関数を自作したいのですが、 いろいろWEBで調べましたが、なかなか見つかりません アルゴリズムを教えてください。 ちなみに動作するOSはOS/400です。 Cコンパイラーはありません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- moisabc
- ベストアンサー率35% (7/20)
以下の手法はどうでしょうか? 01 time-a. 03 hh pic 9(2). 03 mm pic 9(2). 03 ss pic 9(2). 01 tbl. 03 tbl-a pic x(3) occurs 100. accept timeで時間を取得し、time-aにmove その時間をもとにテーブルの添字の値を決定し、 テーブルtbl-a(添字)を乱数とする。 非常に簡単ですが、JOB実行時間によって内容が変化します。 COBOLでは確か乱数関数はなかったと思います。 (私も一度作ろうとして探したが、そんな関数は見つからなかった記憶がある) sysin カードを使えば更に複雑な事ができると思います。
- punchan_jp
- ベストアンサー率55% (155/280)
COBOLは知らないですが、乱数のアルゴリズムさえわかればいいで しょうか? 非常に単純な乱数のアルゴリズムとしては、C言語の rand() 関数 で使われている線形合同法があります。 基本的には、next という変数を用意して 1 などに初期化しておき、 rand() 関数が呼ばれるごとに next = next * 1103515245 + 12345 を実行し、乱数の最大値を MAX として next を (MAX+1) で割った 余りを返せば、0~MAXまでの乱数が得られます。定数の値はこれに 限らないと思いますが、一般的には、この式が使われているようで す。 ただし、線形合同法は、下位ビットほど乱数としての性質が悪いの で、余りではなく上位ビットを使うように除算した方がいいです。 つまり、N通りの乱数がほしければ、rand() の結果を N 倍して (MAX+1) で割るなどする方がいいとされています。(単純に rand() を N 倍して、整数の範囲を超えないように注意) さらに質のいい乱数が必要なら、「M系列」をキーワードに検索し てみてください。
- tullio
- ベストアンサー率20% (11/53)
それほど良質な乱数が必要なわけでは無いようなので,古典的な線形合同法で良いのではないでしょうか.