クイズゲームの問題テーブル(完成)

まだできない - 永字八法の続き。
http://www.eiji8pou.pics/download/lcgs.zipが完成品です。

単純実行

ただ単に実行すると、決められたMの値に対してAとBを自動設定して、一週分の乱数を作成してcsvファイルに書き出します。
Mの値を変更するには、00.txtを開いて、7行目

mov %10,875

数値変数%10の値を変更してください。

組み込んで使う場合

51.txtと76.txtが肝です。
numaliasは全て%0をインクリメントしながら使っています。
76.txtは実行されないところに置いてください。

lcgs_setM(引数一つ)

線形合同法のMの値、つまり乱数の幅を指定します。乱数の幅が0からこの値-1までになります。AとBをランダムに設定します。

lcgs_set_start(引数一つ)

初期値を設定します。何も指定しないと0になり、次に発生させる乱数がBと同じになります。

lcgs_get_next(引数一つ)

結果を受け取る数値変数を引数に取ります。現在のA,B,Mを使い、次の数値を計算して返します。

これを実装するために必要だったその他の関数

使ってないのも含みますが……。

  • スタック系
    • push:数値変数プッシュ
    • push2:文字列変数プッシュ
    • pop:数値変数ポップ
    • pop2:文字列変数ポップ
  • スワップ
  • 数学系
    • div_mod:数値Aを数値Bで割った結果と余りの両方を返す。
    • pow:べき乗。AのB乗を返す。
    • shuffle:配列変数とその長さを与えると、配列変数をランダムに並べなおす。
    • euclidean:二つの数値をユークリッドの互除法で料理し最大公約数を返す。
    • sqrt:平方根を求める。端数切捨て
    • sqrt2:平方根を求める。100倍した数値
  • 文字列系
    • add_num:文字列に数値を文字列化した後で加える。
    • reverse:文字列を前後逆順にする(半角のみ)
    • chop:与えられた文字列変数の最後の文字を切り落とす。
  • 進数系
    • num2decimal:数値をn進数に変換して文字列にして返す。
    • decimal2num:文字列をn進数に解釈して数値にして返す。
    • num2digit:数値を0-9A-Zの文字列に変換する。
    • digit2num:文字列0-0A-Zを対応する数値に変換する。
  • 素数
    • エラトステネスの篩:定数lcgs_M_maxの平方根までの素数を計算してテーブルに蓄える。
  • 素因数分解
    • factorization:数値を素因数分解して内部形式の文字列にする。
    • defactorization:内部形式の素因数表記を数値に変換する。
  • 時間系
    • now2epoch:現在時刻のエポック秒を取得する。
    • date2epoch:特定の日付・時刻をエポック秒に変換する。
    • epoch2date:与えられたエポック秒を日付・時刻に変換する。
    • is_leapyear:西暦年数が閏年がどうか判定する。
    • date2weekday:日付を与えるとその曜日を返す。
    • date2day_of_year:日付を与えると、それが年内の何日目かを返す。

感想

数学の式でさらさらっと簡単に書けることは、エレガントかも知れないが、決して計算しやすいことを意味しない。改めてそう思った次第。