はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン9βをご提供いただいておりまして、前回の記事では9βの言語拡張機能「評価」でTcl乱数関数を定義しております。引き続きTcl乱数関数を定義します。本記事はマニュアル未記載な内容でMind9の本来のサポートレベルを超えた内容です。
前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6
9βの言語拡張機能「評価」とは
たいへんお手数ですが、前回の記事をご参照ください。
お題のソースコード
今回はこちらに記載の
[使用例2]の(2)に対応した関数を用意したいと考えております。
% expr rand() * 100 ---(1)
75.90084829176816
% expr rand() * (5-2)+2 ---(2)
2.5687755898427103
% set x [expr rand() * 100] ---(3)
28.997123674022557
また、記事中にあります下記のコメントについても検証してみます。
※a以上b以下の乱数を生成する場合は(b-a+1)+a になります。
ライブラリ
範囲指定の疑似乱数とは 関数 整数入力 整数入力 小数出力 (変数 変数 → 小数)
※ 範囲指定の最小値以上~最大値未満 の 乱数を戻す
最小値は 変数
最大値は 変数
最大値に 入れ
最小値に 入れ
「expr { rand() * ( 」を コマンドラインにトークンを設定し
最大値を 文字列変換し コマンドラインにトークンを追加し
「 - 」を コマンドラインにトークンを追加し
最小値を 文字列変換し コマンドラインにトークンを追加し
「) + 」を コマンドラインにトークンを追加し
最小値を 文字列変換し コマンドラインにトークンを追加し
「 }」を コマンドラインにトークンを追加し
コマンドラインを 評価した値を 数値変換・小数として
捨てる。
範囲指定の疑似乱数2とは 関数 整数入力 整数入力 小数出力 (変数 変数 → 小数)
※ 範囲指定の最小値以上~最大値+1未満 の 乱数を戻す
最小値は 変数
最大値は 変数
最大値に 入れ
最小値に 入れ
「expr { rand() * ( 」を コマンドラインにトークンを設定し
最大値を 文字列変換し コマンドラインにトークンを追加し
「 - 」を コマンドラインにトークンを追加し
最小値を 文字列変換し コマンドラインにトークンを追加し
「 + 1) + 」を コマンドラインにトークンを追加し
最小値を 文字列変換し コマンドラインにトークンを追加し
「 }」を コマンドラインにトークンを追加し
コマンドラインを 評価した値を 数値変換・小数として
捨てる。
疑似乱数()と種子指定の疑似乱数(n)の定義は前回記事をご参照ください。
テスト用コード
"randomtcl.src"を コンパイルする。
簡易小数表示とは (小数 → ・)
10桁で 小数形式で表示すること。
※ テスト用
メインとは
コンソールを開く
「疑似乱数() 疑似乱数() 種子指定の疑似乱数(5000) 疑似乱数()」を 表示し 改行し
疑似乱数()を 簡易小数表示し 空白表示し
疑似乱数()を 簡易小数表示し 空白表示し
種子指定の疑似乱数(50000)を 簡易小数表示し 空白表示し
疑似乱数()を 簡易小数表示し 改行し
疑似乱数()を 簡易小数表示し 空白表示し
疑似乱数()を 簡易小数表示し 空白表示し
種子指定の疑似乱数(50000)を 簡易小数表示し 空白表示し
疑似乱数()を 簡易小数表示し 改行し
「疑似乱数() 疑似乱数() 種子指定の疑似乱数(8000) 疑似乱数()」を 表示し 改行し
疑似乱数()を 簡易小数表示し 空白表示し
疑似乱数()を 簡易小数表示し 空白表示し
種子指定の疑似乱数(80000)を 簡易小数表示し 空白表示し
疑似乱数()を 簡易小数表示し 改行し
「範囲指定の疑似乱数(2,5) 範囲指定の疑似乱数2(2,5) 範囲指定の疑似乱数(-5,5) 範囲指定の疑似乱数2(-5,5)」を 表示し 改行し
20で 回数指定し
範囲指定の疑似乱数(2,5)を 簡易小数表示し 空白表示し
範囲指定の疑似乱数2(2,5)を 簡易小数表示し 空白表示し
範囲指定の疑似乱数(-5,5)を 簡易小数表示し 空白表示し
範囲指定の疑似乱数2(-5,5)を 簡易小数表示し 空白表示し 改行し
繰り返すこと。
お題のソースコードのMind9βでのビルド
C:\developments\vscode\mind9>mind randomtcl4 guilib
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> randomtcl4.exe
お題のMind9βでの実行の様子
今回はコンソールウィンドウを展開していますので、CUI出力を以下に示します。
疑似乱数() 疑似乱数() 種子指定の疑似乱数(5000) 疑似乱数()
0.8651010943 0.7540918136 0.3913184630 0.8894071583
0.2661097517 0.5065961725 0.3913184630 0.8894071583
疑似乱数() 疑似乱数() 種子指定の疑似乱数(8000) 疑似乱数()
0.2661097517 0.5065961725 0.6261095408 0.0230514533
範囲指定の疑似乱数(2,5) 範囲指定の疑似乱数2(2,5) 範囲指定の疑似乱数(-5,5) 範囲指定の疑似乱数2(-5,5)
3.2773268080 2.0422155038 -1.2100702646 3.0839687195
3.7078914767 2.7093978621 2.1246692897 -0.2515720717
2.4985975663 3.2390617455 -2.7231101076 3.4572641661
4.7924106860 2.0618672520 4.5072617938 4.4038658097
2.7561811748 3.5160059396 3.7795662455 3.9868772365
2.3942856390 5.6783129031 -1.4875931416 -1.6757241705
2.5737818142 4.0679356335 4.4854807851 -2.2768887469
3.9993175180 5.3726993498 -2.6050686639 -3.2279372621
3.6523004862 4.9523616186 -4.1456899648 4.2276372505
4.9725281712 2.3746322004 -3.8915196661 -4.7481315712
4.4961861365 3.8671948546 -0.1401971584 4.5769948194
4.3323443124 4.2811441283 2.9734113477 5.0369729595
3.7466902839 4.1648014980 4.5469430739 1.0194669953
2.5950335039 4.3041329544 -1.0935902158 0.5321669213
3.9443945149 2.5848152286 -2.5261310290 4.1473747846
3.0712742238 4.5411718835 -1.3103856735 -3.5172150678
3.6817334903 4.5263616343 -3.6000321194 5.1861869112
3.7027497784 3.4873669359 0.4402304745 -0.6510557237
4.3744867013 4.6639843651 -1.0369377658 2.9056673245
2.4229244494 3.4549613900 -1.1597964848 -2.4694724150
範囲指定の疑似乱数2の方は指定最大値以下というよりは(指定最大値+1)未満という感じのようでした。
範囲指定の疑似乱数の方でマイナス値の最小値を与えるとマイナス側にも乱数がふれるので、私的にはC#のrandom.next(min,max)相当が対応できたので満足です。
下記の参考記事に下記のような記述がありました。このとおりに対応すると整数にまるめられるので指定最大値以下とはなりますが、小数点は一次出力としてはほしいので、こちらのパターンの実装は当面行いません。
# generate random integer number in the range [min,max]
proc RandomInteger4 {min max} {
return [expr {int(rand()*($max-$min+1)+$min)}]
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!