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

このQ&Aに関連する最新のQ&A

A 回答 (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 カードを使えば更に複雑な事ができると思います。
    • good
    • 0

COBOLは知らないですが、乱数のアルゴリズムさえわかればいいで


しょうか?

非常に単純な乱数のアルゴリズムとしては、C言語の rand() 関数
で使われている線形合同法があります。

基本的には、next という変数を用意して 1 などに初期化しておき、
rand() 関数が呼ばれるごとに
next = next * 1103515245 + 12345
を実行し、乱数の最大値を MAX として next を (MAX+1) で割った
余りを返せば、0~MAXまでの乱数が得られます。定数の値はこれに
限らないと思いますが、一般的には、この式が使われているようで
す。

ただし、線形合同法は、下位ビットほど乱数としての性質が悪いの
で、余りではなく上位ビットを使うように除算した方がいいです。
つまり、N通りの乱数がほしければ、rand() の結果を N 倍して
(MAX+1) で割るなどする方がいいとされています。(単純に
rand() を N 倍して、整数の範囲を超えないように注意)

さらに質のいい乱数が必要なら、「M系列」をキーワードに検索し
てみてください。
    • good
    • 0

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

    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCOBOLでHEXを印字する

COBOLで項目内容を16進表示で印字したい。
例 12345 → F1F2F3F4F5

よろしくお願いします。

Aベストアンサー

テーブルサーチでしょうね。ディスプレイ値とヘキサ値の対応表をサーチ命令でサーチすればいい。

それ以外の方法としては、アッセンブラ-でサブプログラムを作ってコード変換させるのがいいと思います。

QCOBOL85からCOBOL2002移行

HPのOSバージョンアップして、COBOL85からCOBOL2002移行の作業をしました。再コンパイルして、生成されたモジュール(又はオブジェクトファイル.o)のサイズは元の2、3倍になってしまいましたが、どういうことですか?ご教示お願いします。

Aベストアンサー

>なぜバイナリ構造が変更したら、実行モジュール大きくなるのは
>少し、詳しく教えていただけませんか。
ちゃんと書くと長いので掻い摘んで描くと
RISCではコンパイル時点で命令を細かく分け、実行時に並列計算できるもの探して実行していましたが、
Itaniumで採用したEPICではコンパイル時点で並列部分を抽出し実行モジュールに並列情報を持たせています。
アーキテクチャが変わると実行モジュールの構成(サイズ)が変わるのは仕方がないことです。

QCOBOLの定義について

COBOLの定義で
PIC S9 (07) COMP-3
というデータがあってこれを自分で書かなくてはなりませんが、どんなにやってもデータ例外が出てしまします。自分ではHEX状態で
-------
001
00C
-------
みたいなものかと思っていますが、違うようです。

どなたかわかるかたいましたら教えていただけませんか。
よろしくお願しまSう。

Aベストアンサー

>ファイルナンバーは文字列なので

文字としたいなら、「PIC X(n)」で宣言する必要があります。
「PIC 9(n)」は、外部10進であり、そのまま演算にも使えれば表示もできる型です。

PIC 9(5)であれば、内部形式は次のようになります。

X'FdFdFdFdsd'

1バイトを縦で表す方が分かりやすければ、

FFFFs
ddddd

です。

dはX'0'~'9'の値、sは符号で、正=X'C'、負=X'D'、符号なし=X'F'。
dの部分に、'0'~'9'以外の値を入れて参照すると、データ例外になります。

QCOBOLでのランダムアクセス

すみませんCOBOL初心者です。

FILE-CONTROL.
SELECT URIAGE-MOKUHYOU ASSIGN TO "c:\dat\mokuhyou.dat"
ORGANIZATION IS INDEXEDACCESS MODE IS RANDOM RECORD KEY IS UM-SHITEN-CODE.
DATADIVISION.
  FILESECTION.
  FD URIAGE-MOKUHYOU.
  01 UM-REC.
   05 UM-SHITEN.
    10 UM-SHITEN-CODEPIC X(4).
    10 UM-SHITEN-MEIPIC X(20).
   05 UM-KINGAKUPIC 9(10) OCCURS 12.
WORKING-STORAGESECTION.
  01 TSUKIPIC 9(2).
  01 WK-SHITEN-CODEPIC X(4).

PROCEDUREDIVISION.
  DISPLAY "支店コードを入力してください --> : "
  ACCEPT WK-SHITEN-CODE
  OPEN INPUT URIAGE-MOKUHYOU
  READ URIAGE-MOKUHYOU
   INVALID KEY
    DISPLAY "ERROR; 支店コード = " WK-SHITEN-CODE
   NOT INVALID KEY
    DISPLAY WK-SHITEN-CODE " の売上げ目標は " UM-REC
  END-READ.
  STOP RUN.

というプログラムを作成し、"mokuhyou.dat"という入力ファイルに正しくデータが格納されているのですが、コンパイルは問題なく、実行すると、
JMP0310I-U OPEN ERROR FILE=mokuhyou.dat. 'ACC-METHOD'. PGM=TEST046 ADR=00401258
とまず画面にでて、OKを押すと、
JMP0099I-U FORCED TERMINATION CODE=0310
というエラーになります。
おそらくファイルが正常に読み込めないものと推測されますが、解決法を教えてください。お願いします。

すみませんCOBOL初心者です。

FILE-CONTROL.
SELECT URIAGE-MOKUHYOU ASSIGN TO "c:\dat\mokuhyou.dat"
ORGANIZATION IS INDEXEDACCESS MODE IS RANDOM RECORD KEY IS UM-SHITEN-CODE.
DATADIVISION.
  FILESECTION.
  FD URIAGE-MOKUHYOU.
  01 UM-REC.
   05 UM-SHITEN.
    10 UM-SHITEN-CODEPIC X(4).
    10 UM-SHITEN-MEIPIC X(20).
   05 UM-KINGAKUPIC 9(10) OCCURS 12.
WORKING-STORAGESECTION.
  01 TSUKIPIC 9(2).
  01 WK-SHITEN-CODEPIC X(4).

PROCEDU...続きを読む

Aベストアンサー

う~ん、惜しい。

SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS SEQUENTIAL.
か、
SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS LINE SEQUENTIAL.
にする(行順ファイルがサポートされてて使える場合)

SELECT N-URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU"
  ORGANIZATION IS INDEXED
  ACCESS MODE IS DYNAMIC
  RECORD KEY IS NUM-SHITEN-CODE.
にする。索引ファイルを使う場合、主ファイル名は8文字以内に、拡張子は付けないのが無難。あと、ファイル名は大文字にしとく方が無難(後述)

  05 UM-KINGAKU PIC 9(10) OCCURS 12.
の後ろに
  05 FILLER PIC X(2).
が必要(改行コードのCRとLFの分)

  MOVE UM-REC TO NUM-REC
はやっちゃいけない(テキスト側に改行コードのフィラが増え、テキストファイルと索引ファイルのレコード構造が違ってしまったから。それに各項目ごとに移送してるから不要)

  REWRITE NUM-REC

  WRITE NUM-REC
   INVALID KEY
    REWRITE NUM-REC
  END-WRITE
にする。OUTPUTオープンしてるからファイルは空になってる。つまりレコードは1つも存在しないからREWRITEは出来ない。

「WRITEしてみてINVALID KEYだったらREWRITE」をする理由は、元のテキストファイルに
0001SHITEN-A旧店名、AAに変更済~~~
0001SHITEN-AA~~~~~~~~~~~~
0002SHITEN-B~~~~~~~~~~~~
0003SHITEN-C~~~~~~~~~~~~
のように「同一の支店コードが2つ書いてあった時」のため。REWRITEではなく「同一コードが2つある」とのエラー表示をして終了するのでも良い。

これでダメだとしたら
「使ってるCOBOLに方言があって、テキストファイルを扱う場合のSELECT文に、何か特殊な書き方をしなきゃならない」

「『c:\dat\』のように、ドライブやパス指定を書けない」

「索引ファイルのファイル名には『n-mokuhyou.dat』のように拡張子は付けちゃいけない」

「索引ファイルのファイル名は『n-mokuhyou』のように8文字を超えちゃいけない」

「ファイル名に英文字の小文字を含むと問答無用でエラー」
などの制約が存在する場合がある。

特に索引ファイルでの「拡張子は付けない」と「主ファイル名は8文字以内」は注意。これを守らないとCOBOLが内部でキーファイルのファイル名を自動生成する際に、生成に失敗して実行時にOPEN文で予期せぬエラーが出る可能性が。
古いMS-DOSの仕様を引きずってて廃止して欲しい制約なんだが…。

あと「古いMS-DOSの仕様」に関連してか、ファイル名は大文字を使うのが慣例になっている。ファイル名に小文字を使うと動かないCOBOLがあるらしいので。

う~ん、惜しい。

SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS SEQUENTIAL.
か、
SELECT URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU.TXT"
  ORGANIZATION IS LINE SEQUENTIAL.
にする(行順ファイルがサポートされてて使える場合)

SELECT N-URIAGE-MOKUHYOU
  ASSIGN TO "C:\DAT\MOKUHYOU"
  ORGANIZATION IS INDEXED
  ACCESS MODE IS DYNAMIC
  RECORD KEY IS NUM-SHITEN-CODE.
にする。索引ファイルを使う場合、主ファイル名は8文字...続きを読む

QCOBOL,MFCOBOLについて

こんにちは。
今日はCOBOL,とMFCOBOLについて教えていただきたいです。

COBOLとはどのような言語でどのように使われているのか?
MFCOBOLとはどのような言語でどのように使われ、COBOLとは何が違うのか?

以上のことを教えてください。
お願いしまーす。

Aベストアンサー

>COBOLとはどのような言語でどのように使われているのか
(1)決まった語句を使って英語を書くようにプログラムする
 言語。センテンスの終わりは「.」。読んで判りやすい。
(2)4つのディビジョンがある。
(3)ファイル定義をまずする。
(4)コンパイル言語。
(5)事務計算向け。10進演算。
(6)会社等にCOBOLのソフト遺産が膨大にありそう。
   過去には大規模システムに採用された。昔は大型機中型   機での利用が多かった。コンパイラが重いため。
(7)40年の歴史。現在も進化している。
(8)CODASYL(団体)が管理。
http://www-6.ibm.com/jp/developerworks/linux/000929/j_cobol.html
http://members10.tsukaeru.net/bitwalk/cobol.html
http://www.suzugamine.ac.jp/~moriya/bunpou.html
http://www4.ocn.ne.jp/~nishi10/cobol.htm
http://hp.vector.co.jp/authors/VA003604/comp/develop/lang/cobol.htm
http://www.cobol.gr.jp/knowledge/technical/tec006.html
今後に関して1見解。
http://nc.nikkeibp.co.jp/jp/articles/features/20000828/
http://itpro.nikkeibp.co.jp/free/NC/NEWS/20010613/4/
○MFCOBOLはマイクロフォーカスジャパン(株)の販売しているCOBOL処理系の1つ。

>COBOLとはどのような言語でどのように使われているのか
(1)決まった語句を使って英語を書くようにプログラムする
 言語。センテンスの終わりは「.」。読んで判りやすい。
(2)4つのディビジョンがある。
(3)ファイル定義をまずする。
(4)コンパイル言語。
(5)事務計算向け。10進演算。
(6)会社等にCOBOLのソフト遺産が膨大にありそう。
   過去には大規模システムに採用された。昔は大型機中型   機での利用が多かった。コンパイラが重いため。
(7)40年の歴史。現...続きを読む

Q音楽プレイヤーのランダム再生について アルゴリズム

お世話になります。

自動車で音楽をかけながら走っているときに、いつも思うことがあります。

音楽プレイヤーなどで、ランダム再生とループ再生の二つの機能がありますが、
両方をONにしたときは、どのような順序でループされるのでしょうか。

例えば、1から7までの曲があるとします。
ランダム&ループにて、一曲ごとに次の一曲を選出するのでしょうか。
だとすると、乱数なので何回もかかってしまう曲や、いつになってもかからない曲が
出てきてしまいます。

それとも、1から7までの曲を最初にランダムに並び替えて、プレイしているのでしょうか。
この方法だと、例えば7,1,6,2,5,3,4などとすべて一度ずつかかりますが、
二周目からはどうなるのでしょうか。先ほどと同じ並び方、7,1,6,2,5,3,4が
繰り返されるのでしょうか。これだと初めはランダムとして聞けますが、
二周目からはランダムとは言えません。

それとも、一度すべてかけ終わった後に、もう一度
並び替えを行うのでしょうか。ただし、これだと周の最後にかかった曲と
次の周の最初にかかる曲が同じになってしまうことがあります。

…一般の市販されているランダム+ループ再生は、どのような仕様で
動いているのでしょうか。

詳しい情報をお持ちの方、ぜひお教えください。

よろしくお願いいたします。

お世話になります。

自動車で音楽をかけながら走っているときに、いつも思うことがあります。

音楽プレイヤーなどで、ランダム再生とループ再生の二つの機能がありますが、
両方をONにしたときは、どのような順序でループされるのでしょうか。

例えば、1から7までの曲があるとします。
ランダム&ループにて、一曲ごとに次の一曲を選出するのでしょうか。
だとすると、乱数なので何回もかかってしまう曲や、いつになってもかからない曲が
出てきてしまいます。

それとも、1から7までの曲を最初にランダムに並び...続きを読む

Aベストアンサー

ソフトにより異なります。

例えばApple製品ですと最初にシャッフルされたら2周目からも順番は固定です。

RealPlayerですと、リストがシャッフルされて再生すると、再生がすべて終わればまたシャッフルされますy。
http://i.real.com/product/help/rp12/ja/Content/shuffle-continuous_play.htm

QCOBOLの勉強をしたいのですが・・・

私は、独学でプロラムを勉強しているのですが、COBOLに関して解らない事があります。NEC用ACOS1-4とかの端末機でも良いので、COBOL勉強をしたいのです。
一般には、なかなか手には入りません。なぜ端末かと言うと、一般PCはどこでも手に入り勉強が出来ますが、オフコンは専門学校か企業でしか触れません。オフコンでCOBOLの勉強する方法は無いでしょうか?無ければCOBOLの一般用ソフトは今存在するのでしょうか?
COBOLの勉強をしたいです。

Aベストアンサー

海外のサイトになるのですが、富士通さんが、勉強用
として、フリーのCOBOLを配布しているようです。

http://download.cnet.com/downloads/0-10085-100-895627.html

それから、COBOL関係の情報のある
「コボラー ドット コム」を紹介しておきます。

http://www.coboler.com/

市販のCOBOLの中では、PowerCOBOLのアカデミック
エディション(Scoolとなってます)で8万円ぐらい
ですね(www.getplus.co.jpにて調べました)

PCで動くCOBOLは、富士通のPower COBOL97,
日立のCOBOL85、あとは、Microfocus COBOLなどが
ありますが、業務向けなので、結構高価です。

QCOBOL97,Power-COBOLでの効率の良い書き方

汎用機のCOBOLでは添字にはCOMP-1を使うと効率が良いとか、ベースレジスタ削減のために 01レベルのワーク領域の数を減らす(少数の01レベルの配下にワーク領域を定義する)などがマニュアルに記載されていました。
ところがパソコン/サーバ上で動くCOBOLの場合は、計算用にCOMP-3を使うと処理効率が悪い、計算用ではCOMP-3よりはDISPLAY項目、さらに良いのはCOMP-5である、などと言う記事もあり汎用機COBOLとはずいぶん違うようです。実際のところ、パソコン/サーバ上で動くCOBOLで実行時の効率が良いプログラムを書くためには、どのような事に注意すれば良いのでしょうか?

Aベストアンサー

以下が参考になるのでは?

http://q.hatena.ne.jp/1171405263

>>実際のところ、パソコン/サーバ上で動くCOBOLで実行時の効率が良いプログラムを書くためには、どのような事に注意すれば良いのでしょうか?

昔は、汎用機やオフコン、パソコンでCOBOLのアプリを書いていました。ハードレベルのことは、よくわかりませんが、記載されていたとおりだという気がしますね。でも、メモリーや処理効率が悪とはいっても、人間のレベルからしたら、気にしないでもいい程度だと思いますよ。

個人的には、メモリ効率等よりも汎用機・オフコンなどとソースの共用ができるほうが良いと思うので、汎用機に合わせたいところですが、汎用機で使う予定が無いならパソコン・サーバ上でベストな指定でもいいかもしれませんね。

そして、数値計算(特にお金の計算)では、10進で行われるCOMP-3が計算誤差やデバッグの容易さで有利だと思えます。

Qhexについて

応答メッセージなどに関する文書なのですが、hexという表現が出てきます。04hexとか、27hexとか・・・いろいろなのですが、数字プラスhexというのは、どういう意味なのでしょうか。

Aベストアンサー

16進数である事を表すためにhexやhを使います。
04h、27hと言う具合にです。
04hはコード表でEOT、End Of Text、文の終わり、27hはアポストロフです。意味はその通信のプロトコル次第なのでわかりません。
http://c-production.com/special/03090704.html

Qオフコン(富士通Kシリーズ)COBOLと汎用機COBOLの違い

 私、富士通オフコン(KやPRIMERGY6000)でのシステム開発を10年以上やっています。当然COBOL言語での開発です。オフコン市場が縮小傾向(AS400は別のようですが)にあるなか、汎用機の開発やリプレースは盛んに行われていると認識しています。

 私の勘ではデータベースのREAD/WRITEのあたりや画面プログラムの表示のさせ方などが違うのでは、と思うのですが、実際に富士通オフコンのCOBOL-Gと汎用機(富士通でもIBMでもなんでも構いません)COBOLを経験された方に、その相違点をお聞きしたく存じます。

 宜しくお願いします。

Aベストアンサー

COBOLというより、DBMSやDCモニタ(富士通ならAIM,IBMならCICSやIMS等)による違いですね。
DBについてはSQLをサポートするRDBMSなら、アプリケーションのコーディングレベルは大きな違いは無いでしょうけど、階層型やネットワーク型DBだとそれぞれ独自の特色があるので使うDBMSによって大きく異なるでしょう。
画面は最近はメインフレームでもWWWを使ったりもするようですが、そうでもない限り、これもDCモニタによってやり方は全然違います。
従って、メインフレームの勉強をしたいのなら、まずターゲットとするDB/DCを決めないといけません。


人気Q&Aランキング

おすすめ情報