• 締切済み

ランダム関数を作りたい。

COBOLでランダム関数を自作したいのですが、 いろいろWEBで調べましたが、なかなか見つかりません アルゴリズムを教えてください。 ちなみに動作するOSはOS/400です。 Cコンパイラーはありません。

みんなの回答

  • moisabc
  • ベストアンサー率35% (7/20)
回答No.3

以下の手法はどうでしょうか? 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 カードを使えば更に複雑な事ができると思います。

回答No.2

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)
回答No.1

それほど良質な乱数が必要なわけでは無いようなので,古典的な線形合同法で良いのではないでしょうか.

関連するQ&A