日本語プログラミング言語Mindのバージョン９βでTcl乱数関数の定義を試みる３

# はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン９βをご提供いただいておりまして、[前回の記事](https://qiita.com/mylifewithviolin/items/172f91ba20abbb2b3869)では９βの言語拡張機能「評価」でTcl乱数関数を定義しております。引き続きTcl乱数関数を定義します。本記事はマニュアル未記載な内容でMind９の本来のサポートレベルを超えた内容です。


# 前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6　

# ９βの言語拡張機能「評価」とは
たいへんお手数ですが、[前回の記事](https://qiita.com/mylifewithviolin/items/172f91ba20abbb2b3869)をご参照ください。

# お題のソースコード

今回はこちらに記載の

https://blog.it-see.net/it-dokata/tcl-tk/mathematical-function/#toc8

[使用例2]の（２）に対応した関数を用意したいと考えております。

```tcl:
% 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 になります。

## ライブラリ
```mind:randomtcl.src
範囲指定の疑似乱数とは　関数　整数入力　整数入力　小数出力 （変数 変数 → 小数）
    ※ 範囲指定の最小値以上～最大値未満 の 乱数を戻す  
        最小値は　変数
        最大値は　変数

    最大値に　入れ
    最小値に　入れ
    「expr { rand() * ( 」を　コマンドラインにトークンを設定し
    最大値を  文字列変換し　コマンドラインにトークンを追加し
    「 - 」を　コマンドラインにトークンを追加し
    最小値を  文字列変換し　コマンドラインにトークンを追加し
    「) + 」を　コマンドラインにトークンを追加し
    最小値を  文字列変換し　コマンドラインにトークンを追加し
    「 }」を　コマンドラインにトークンを追加し
    　コマンドラインを　評価した値を　数値変換・小数として
    捨てる。

    
範囲指定の疑似乱数２とは　関数　整数入力　整数入力　小数出力 （変数 変数 → 小数）
    ※ 範囲指定の最小値以上～最大値+1未満 の 乱数を戻す  
        最小値は　変数
        最大値は　変数

    最大値に　入れ
    最小値に　入れ
    「expr { rand() * ( 」を　コマンドラインにトークンを設定し
    最大値を  文字列変換し　コマンドラインにトークンを追加し
    「 - 」を　コマンドラインにトークンを追加し
    最小値を  文字列変換し　コマンドラインにトークンを追加し
    「 + 1) + 」を　コマンドラインにトークンを追加し
    最小値を  文字列変換し　コマンドラインにトークンを追加し
    「 }」を　コマンドラインにトークンを追加し
    　コマンドラインを　評価した値を　数値変換・小数として
    捨てる。
```
疑似乱数()と種子指定の疑似乱数(ｎ)の定義は前回記事をご参照ください。

## テスト用コード
```mind:randomtcl4.src
"randomtcl.src"を　コンパイルする。

簡易小数表示とは　（小数　→　・）
	10桁で　小数形式で表示すること。

    ※ テスト用
メインとは
    コンソールを開く

    「疑似乱数()　疑似乱数()　種子指定の疑似乱数(5000)　疑似乱数()」を　表示し　改行し
    疑似乱数()を 簡易小数表示し　空白表示し
    疑似乱数()を　簡易小数表示し　空白表示し
    種子指定の疑似乱数(50000)を　簡易小数表示し　空白表示し
    疑似乱数()を　簡易小数表示し　改行し

    疑似乱数()を　簡易小数表示し　空白表示し
    疑似乱数()を　簡易小数表示し　空白表示し
    種子指定の疑似乱数(50000)を　簡易小数表示し　空白表示し
    疑似乱数()を　簡易小数表示し　改行し

    「疑似乱数()　疑似乱数()　種子指定の疑似乱数(8000)　疑似乱数()」を　表示し　改行し
    疑似乱数()を　簡易小数表示し　空白表示し
    疑似乱数()を　簡易小数表示し　空白表示し
    種子指定の疑似乱数(80000)を　簡易小数表示し　空白表示し
    疑似乱数()を　簡易小数表示し　改行し

    「範囲指定の疑似乱数(2,5)　範囲指定の疑似乱数２(2,5)　範囲指定の疑似乱数(-5,5)　範囲指定の疑似乱数２(-5,5)」を　表示し　改行し
    ２０で　回数指定し
    範囲指定の疑似乱数(2,5)を　簡易小数表示し 空白表示し
    範囲指定の疑似乱数２(2,5)を　簡易小数表示し　空白表示し
    範囲指定の疑似乱数(-5,5)を　簡易小数表示し 　空白表示し
    範囲指定の疑似乱数２(-5,5)を　簡易小数表示し 　空白表示し  改行し
    繰り返すこと。  
```
# お題のソースコードのMind9βでのビルド

```cmd:
C:\developments\vscode\mind9>mind randomtcl4 guilib

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> randomtcl4.exe
```

# お題のMind9βでの実行の様子
今回はコンソールウィンドウを展開していますので、CUI出力を以下に示します。

```cmd:
疑似乱数()　疑似乱数()　種子指定の疑似乱数(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,5)　範囲指定の疑似乱数(-5,5)　範囲指定の疑似乱数２(-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
```

範囲指定の疑似乱数２の方は指定最大値以下というよりは（指定最大値＋１）未満という感じのようでした。
範囲指定の疑似乱数の方でマイナス値の最小値を与えるとマイナス側にも乱数がふれるので、私的には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)}]
```    
https://wiki.tcl-lang.org/page/rand


# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕４０周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます！