TeX Alchemist Online

TeX を使って化学のお仕事をしています。

TeX で乱数を使う (4) ~ 2次元シャッフル

前々回の記事 TeX で乱数を使う (2) では,「インプットした問題ストックからランダムな順序で出題する」というお題を扱いました。前回の記事 TeX で乱数を使う (3) では,「語順整序問題における語順をランダムに並べ替え,逆置換を用いてその正解も自動表示する」というお題を扱いました。今回は,その2つを合体して,「語順がランダムに並べ替えられた語順整序問題を,ランダムな順序で出題する」という複合版を実現してみましょう。

これはすなわち,「問題の順序」と「各問題における語順」という2方向のシャッフルが絡み合うことになります。

f:id:doraTeX:20190118130045p:plain
2方向のシャッフルの共存

2方向のシャッフルが同時に共存するので,名前空間の分離を意識するなど,しっかり設計しておかないと双方のシャッフルが干渉してしまいます。randomshuffle パッケージの name オプションに問題番号を含めることで,「シャッフルのシャッフル」が干渉せぬよう実現できます。randomshuffle パッケージ自体も,2方向のシャッフルの共存にしっかり耐えるよう改修しておきました。

続きを読む

TeX で乱数を使う (3) ~ 逆置換の活用

前回の記事で作成した randomshuffle パッケージは,n次対称群 $\mathfrak{S}_n$ の元 $\sigma$ をランダムに生成したとき,同時にその逆置換 $\sigma^{-1}$ も生成する仕様になっていました。逆置換はどういう場面で役立つのでしょうか。

例えば次のような,英語の試験でよくある語順整序問題とその解答を見てみます(問題ネタは2016年センター試験「英語」より)。

f:id:doraTeX:20190117014913p:plain

このような語順整序問題の生成と解答表示では,次のように,置換とその逆置換が両方作用しています。

f:id:doraTeX:20190117022232p:plain

まず,解答選択肢記号 ㋐~㋕ に応じて単語を順に割り当て,それをシャッフルすることで問題の語群を生成します。次に,解答においては,空欄番号 1~6 に当てはまる正解の単語記号 ㋐~㋕ を表示します。このとき,前半の「シャッフルされた語群の生成」と後半の「それを正しい順に並べた単語記号列の生成」では,ちょうど置換と逆置換の関係になっています。

これを利用して,ランダムにシャッフルされた語群を毎回自動生成し,その正解も自動出力するという文書を作ってみましょう。

続きを読む

TeX で乱数を使う (2) ~ ランダムなシャッフル

前回の記事では,TeX で乱数を生成するいろいろな方法を調べ,その使用例としてモンテカルロ・シミュレーションを見ました。本記事では,実際の組版の場面においてより実用的と思われる乱数の活用例を見てみましょう。

教材作成の仕事をしていると,周囲でしばしば「TeX で乱数って作れないんですか?」という質問を耳にします。前回の記事で見たように,TeX で乱数を生成する方法は多々あります。しかし,そのような質問をする教材作成関係者が思い描いている「乱数」というのは,乱数そのものではなく,「ランダムなシャッフル」である場面が多く見られます。要するに,「問題がランダムな順序で出題される試験問題を作りたい」という要望であるわけです。乱数の場合,1, 3, 3, 1, 3, 2,... のように,同じ値が何度も登場しますが,それをそのまま試験の問題番号としてしまうと,同じ問題が何度も出てきてしまって,試験としてふさわしくありません。あくまで,n個の問題を並べ替えた n! 通りの順列の中からランダムに1つの順列を選び出して試験として出題したい,というわけですね。

シャッフリングアルゴリズム

さて,n個のものをランダムな順序にシャッフルするには,どうすればよいでしょうか。これもまた Knuth 先生の The Art of Computer Programming を見てみましょう。The Art of Computer Programming, Vol.2, 3rd ed., §3.4 に,Algorithm P として,次のようなシャッフリングアルゴリズムが掲載されています。

f:id:doraTeX:20190116000732p:plain
出典:Donald E. Kunth, The Art of Computer Programming, Vol.2, 3rd ed., §3.4

このアルゴリズムを TeX 言語で実装してパッケージ化してみました。

続きを読む

TeX で乱数を使う

この記事は TeX & LaTeX Advent Calendar 2018 の19日目の記事です。18日目は keisuke495500 さんでした。 20日目は isaribi_saitoh さんです。

本記事では,TeX で乱数を取り扱う方法,および乱数の活用法を解説します。

  • 線形合同法による擬似乱数生成
  • seed の与え方
    • TeX による時刻取得
  • TeX で擬似乱数を生成する種々の方法
    • lcg パッケージ
      • 毎秒異なる seed を指定したい場合
    • fp パッケージの \FPrandom
    • pgf パッケージの rnd / rand / random
    • 専用プリミティブ
      • 実装
      • 既知の不具合
    • expl3 の \fp_eval:n
    • LuaTeX の math.random
    • LuaTeX でメルセンヌ・ツイスターの Lua 実装ライブラリを呼び出す
  • 乱数を使う:モンテカルロ・シミュレーション

線形合同法による擬似乱数生成

決定的な動きをする計算機で真の乱数を作り出すことは原理的に不可能なので,(熱雑音を利用するハードウェア乱数生成器など外部からの不規則な入力を用いてランダムネスを実現する方法はありますが)通常は見た目上ランダムに見える数列を計算式に従って規則的に作り出した擬似乱数を用います。擬似乱数を作り出す計算式としては,素朴な方法である線形合同法 (Linear Congruential Generator, LCG) が,実装の単純さおよび動作の高速さゆえに,昔から広く用いられています。

続きを読む

連番のQRコードを大量生成する

f:id:doraTeX:20180727224927p:plain

顧客ID・請求コード・受験番号といった番号や記号をQRコードにエンコードして用紙に印刷しておき,相手ごとに個別化された用紙を配りたい」という状況はよく生じると思います。 それをLaTeXで実現する場合の一例を示します。

また,LaTeX初心者の人にとっては,QRコードは無関係であったとしても「Wordでいう差し込み印刷のようなことをLaTeXでどうやって実現するか」のサンプルにもなるでしょう。

なお,このサンプルに掲載の個人情報は,ダミー個人情報生成サイト なんちゃって個人情報 を活用してランダム生成しました。サンプルデータ作成にとても便利なサイトです。

方法1:qrcodeパッケージでその場で生成する

TeX Live には,qrcodeパッケージ が収録されています。これは,(ASCII文字限定ではありますが)引数に与えられた文字列を

\qrcode{https://ctan.org}

のようにしてQRコードに変換できる便利なパッケージです。これで生成されるQRコードは画像ではなく,なんと TeX の \rule によって描かれた黒正方形の集合体となっています。 (qrcode.sty のソースを見ると,これをよくTeXで実装したなぁと感心させられます……!)

続きを読む