なでしこに実数乱数を追加するプラグイン「なでしこ実数乱数プラグイン」

# 日本語プログラミング言語「なでしこ」 Advent Calendar 2022
　閲覧ありがとうございます。この記事は[なでしこアドカレ2022](https://qiita.com/advent-calendar/2022/nadesiko)の17日目の記事となります。

https://qiita.com/advent-calendar/2022/nadesiko


　EZNAVI.net 望月まさとさん（@eznavi）の16日目の記事はコチラ

https://qiita.com/eznavi/items/a5d00356e91a3e2074cd


　mikecat_mixcさん（@mikecat_mixc）の18日目の記事はコチラ

 https://qiita.com/mikecat_mixc/items/3c4b47eb6c5c60132c54




# 「お久しぶりです」と表示する
　なでしこアドカレ2022では[4日目の記事](https://qiita.com/JKyumekamui/items/3659bf15869875040173)を担当させていただきました。読んでくださった方はお久しぶりです。そうでない方は初めまして。ユメミノウツツと申します。
　前回に引き続きなでしこアドカレ2022の17日目を担当させていただきます。現在時刻12/17 23:12です。マジでヤバいのでご挨拶もほどほどにして本題へ入っていきたいと思います。（ｺﾞﾒﾝﾅｻｲ!!）



# なでしこ実数乱数プラグイン
　今回の記事も作ったものの紹介になります。
　今回作ったのは「なでしこ実数乱数プラグイン」。なでしこさんのプラグインで、貯蔵庫にて公開しております。

https://n3s.nadesi.com/index.php?page=1941&action=show

　プラグインの簡単な説明としては、なでしこに実数乱数を始めとする乱数を使った関数をいくつか追加するプラグインとなります。

# プログラム
　プラグインのプログラムは貯蔵庫にて公開しておりますが、こちらに再掲したいと思います。
```:なでしこ実数乱数プラグイン
//【なでしこ実数乱数プラグイン】
// 　制作：賢者ユメミノウツツ
// 　ver 1.0
// 
// [関数の説明]
// 
// 小数乱数
// ・0以上1未満の実数を返します。
// ・0は含み1は含みません。
// 
// (Aの)実数乱数
// ・0以上A未満（もしくはAより大きく0以下）の実数を返します。
// ・A=1のとき、小数乱数と同じ挙動を示します。
// 
// (Aから、Bまでの|Bの)実数乱数範囲
// ・A以上B未満（もしくはBより大きくA以下）の実数を返します。
// ・A=Bなら常にAを返します。
// 
// 全平仮名乱数
// ・ひらがなを1文字返します。
// ・返すひらがなはUnicodeで0x3041~0x3094です。
// 
// 全カタカナ乱数
// ・カタカナを1文字返します。
// ・返すカタカナはUnicodeで0x30A1~0x30FAです。
// 
// (Sを|Sの)平仮名カタカナランダム変換
// ・文字列を1文字ずつ、ランダムにひらがなかカタカナにします。
// 
// 平仮名乱数
// ・ひらがなを1つ返します。
// ・全平仮名乱数と違い、拗音は1つとします。
// ・返すひらがなはグローバル変数「実数乱数プラグイン平仮名五十音CSV」
// 　を参照してください。
// 
// カタカナ乱数
// ・カタカナを1つ返します。
// ・返すカタカナは平仮名乱数に依存します。
// 
// 数字乱数
// ・0~9を1文字返します。
// 
// (Aを|Aの)プラマイランダム変換
// ・数字の正負をランダムに設定します。
// 
// 小文字アルファベット乱数
// ・小文字の半角アルファベットを1文字返します。
// 
// 大文字アルファベット乱数
// ・大文字の半角アルファベットを1文字返します。
// 
// (Sを|Sの)大文字小文字ランダム変換
// ・文字列を1文字ずつ、ランダムに大文字か小文字にします。
// 
// アルファベット乱数
// ・アルファベットを1文字返します。



// ---- グローバル変数 ----
実数乱数プラグイン平仮名五十音CSV＝「あ,い,う,え,お
か,き,く,け,こ
さ,し,す,せ,そ
た,ち,つ,て,と
な,に,ぬ,ね,の
は,ひ,ふ,へ,ほ
ま,み,む,め,も
や,,ゆ,,よ
ら,り,る,れ,ろ
わ,,,,を
ん,,,,
が,ぎ,ぐ,げ,ご
ざ,じ,ず,ぜ,ぞ
だ,ぢ,づ,で,ど
ば,び,ぶ,べ,ぼ
ぱ,ぴ,ぷ,ぺ,ぽ
きゃ,,きゅ,,きょ
しゃ,,しゅ,,しょ
ちゃ,,ちゅ,,ちょ
にゃ,,にゅ,,にょ
ひゃ,,ひゅ,,ひょ
みゃ,,みゅ,,みょ
りゃ,,りゅ,,りょ
ぎゃ,,ぎゅ,,ぎょ
じゃ,,じゅ,,じょ
びゃ,,びゅ,,びょ
ぴゃ,,ぴゅ,,ぴょ
,,っ,」
実数乱数プラグイン五十音列数=28
実数乱数プラグイン五十音行数=4
// ---- グローバル変数ここまで ----

●小数乱数とは
    // 0以上1未満（0は含み、1は含まない）の実数を返す
    「Math.random()」をJS実行して戻る
ここまで

●(Aの)実数乱数とは
    // 0以上A未満（0は含み、Aは含まない）の実数を返す
    // Aが0未満であれば、Aより大きく0以下の実数を返す
    「Math.random() * ({A})」をJS実行して戻る
ここまで

●(Aから、Bまでの|Bの)実数乱数範囲とは
    // A<Bなら、A以上B未満（Aは含み、Bは含まない）の実数を返す
    // A>Bなら、Bより大きくA以下の実数を返す
    「Math.random()*(({B})-({A}))+({A})」をJS実行して戻る
ここまで

●全平仮名乱数とは
    // ひらがなを1文字返す
    // 乱数でUnicodeを取得して返す。
    // 「ゐ」「ゑ」「ゔ」を含みます。
    // 「きゃ」などの拗音を返したい場合は
    文字コード＝0x3041から0x3094までの乱数範囲
    CHR(文字コード)で戻る
ここまで

●全カタカナ乱数とは
    // カタカナを1文字返す
    // 「ヰ」「ヱ」「ヴ」「ヷ」「ヸ」「ヹ」「ヺ」を含みます。
    // 「ヵ」「ヶ」は含みません。
    文字コード＝0x30F5
    （（文字コード=0x30F5）||（文字コード=0x30F6））の間 //「ヵ」「ヶ」を除くための措置
        文字コード＝0x30A1から0x30FAまでの乱数範囲
    ここまで。
    CHR(文字コード)で戻る
ここまで

●(Sを|Sの)平仮名カタカナランダム変換とは
    // ひらがな、カタカナで構成された文字列のひらがなカタカナを1/2の確率で変える
    // 2文字以上の文字列の場合、各文字に対して処理が行われる
    戻り文字列は空
    Sを反復
        文字＝対象
        フラグ＝2の乱数
        もし、フラグ=0ならば、
            文字＝文字を平仮名変換
        違えば、
            文字＝文字をカタカナ変換
        ここまで
        戻り文字列＝戻り文字列に文字を追加
    ここまで
    戻り文字列で戻る
ここまで

●平仮名乱数とは
    // ひらがなを1つ返す
    // 拗音などもひとまとめにして返す
    // 外来語由来のカナ（ヴやファなど）は未収録。
    // 収録したい場合や拗音がいらないときなどは
    // グローバル変数「実数乱数プラグイン平仮名五十音CSV」
    // 「実数乱数プラグイン五十音列数」「実数乱数プラグイン五十音行数」
    // を書き換えてください。
    五十音＝実数乱数プラグイン平仮名五十音CSVをCSV取得
    
    五十音列＝実数乱数プラグイン五十音列数の乱数
    五十音行＝実数乱数プラグイン五十音行数の乱数
    
    （五十音[五十音列][五十音行]＝「」）の間
        五十音列＝実数乱数プラグイン五十音列数の乱数
        五十音行＝実数乱数プラグイン五十音行数の乱数
    ここまで
    五十音[五十音列][五十音行]で戻る
ここまで

●カタカナ乱数とは
    // カタカナを1つ返す
    // 詳細は平仮名乱数に依存。
    平仮名乱数をカタカナ変換して戻る
ここまで

●数字乱数とは
    // 数字（0~1）を1文字返す
    10の乱数で戻る
ここまで

●(Aを|Aの)プラマイランダム変換とは
    // Aの正負を1/2の確率で入れ替えます。
    フラグ＝2の乱数
    もし、フラグ=1ならば、A=A*-1
    Aで戻る
ここまで

●小文字アルファベット乱数とは
    // 半角小文字アルファベットを1文字返す
    // 英語で使う文字だけ。ウムラウトとかは含みません。
    文字コード＝0x0061から0x7Aまでの乱数範囲
    CHR(文字コード)で戻る
ここまで

●大文字アルファベット乱数とは
    // 半角大文字アルファベットを1文字返す
    // 英語で使う文字だけ。ウムラウトとかは含みません。
    小文字アルファベット乱数を大文字変換して戻る
ここまで

●(Sを|Sの)大文字小文字ランダム変換とは
    // アルファベット文字列の大文字小文字を1/2の確率で変える
    // 2文字以上の文字列の場合、各文字に対して処理が行われる
    戻り文字列は空
    Sを反復
        文字＝対象
        フラグ＝2の乱数
        もし、フラグ=0ならば、
            文字＝文字を小文字変換
        違えば、
            文字＝文字を大文字変換
        ここまで
        戻り文字列＝戻り文字列に文字を追加
    ここまで
    戻り文字列で戻る
ここまで

●アルファベット乱数とは
    // 半角アルファベットを1文字返す
    // 大文字小文字どちらも含みます
    小文字アルファベット乱数を大文字小文字ランダム変換して戻る
ここまで
```
　このプラグインには以下の14個の関数を収録しています。
 - **小数乱数**
 - (Aの)**実数乱数**
 - (Aから、Bまでの|Bの)**実数乱数範囲**
 - **全平仮名乱数**
 - **全カタカナ乱数**
 - (Sを|Sの)**平仮名カタカナランダム変換**
 - **平仮名乱数**
 - **カタカナ乱数**
 - **数字乱数**
 - (Aを|Aの)**プラマイランダム変換**
 - **小文字アルファベット乱数**
 - **大文字アルファベット乱数**
 - (Sを|Sの)**大文字小文字ランダム変換**
 - **アルファベット乱数**

　関数に関する説明はプログラム中に書き込んでありますが、こちらの記事でも使用例を示しながら解説していきますね。



# 関数の説明
## 小数乱数
引数：なし
説明：0以上1未満の実数を返します。0は含み1は含みません。
　（実際ピッタリ0が出ることは相当珍しいことだと思いますが・・・）

　プログラム言語にもよりますが、乱数といったら0～1の実数を返すという言語も多いので、なでしこに実装されていないのには驚きました。ないなら自分で作ってしまおう。それがこのプラグインを作った原動力です。
　内部的にはJavaScriptを直接実行しています。
　動作例です。

```:小数乱数
小数乱数を表示  # -> 0.44706491739197074
小数乱数を表示  # -> 0.31489622721168953
小数乱数を表示  # -> 0.7894324508275841
```

## 実数乱数
引数：Aの
説明：0以上A未満（もしくはAより大きく0以下）の実数を返します。（A=1のとき、小数乱数と同じ挙動を示します。）

　さっきのは小数乱数で、こちらは実数乱数です。整数のプログラム的には「乱数」にあたり、0を下限（もしくは上限）として上限値（下限値）を引数Aで指定します。

```:実数乱数
5の実数乱数を表示  # -> 4.461074280527777
5の実数乱数を表示  # -> 4.166506423776384
5の実数乱数を表示  # -> 0.6777049256513112
```


## 実数乱数範囲
引数：Aから、Bまでの|Bの
説明：A以上B未満（もしくはBより大きくA以下）の実数を返します。（A=Bなら常にAを返します。）

　こちらは「乱数範囲」にあたる関数です。上限値と下限値を引数AとBで指定します。
```:実数乱数範囲
3から5までの実数乱数範囲を表示  # -> 4.834536541406443
3から5までの実数乱数範囲を表示  # -> 4.288952374041871
3から5までの実数乱数範囲を表示  # -> 3.1458025712230357
```


## 全平仮名乱数
引数：なし
説明：ひらがなを1文字返します。返すひらがなはUnicodeで0x3041~0x3094です。

　[Unicodeはコチラを参考にしました](https://www.asahi-net.or.jp/~ax2s-KMTN/ref/unicode/u3040.html)。
 0x3041「ぁ」から0x3094「ゔ」までのひらがなを1文字返します。拗音（「きゃ」など）には対応していないので、そういう使い方がしたければ「平仮名乱数」関数をお使いください。
　地味に「ゐ」とか「ゑ」とかにも対応しています。

```:全平仮名乱数
全平仮名乱数を表示  # -> か
全平仮名乱数を表示  # -> っ
全平仮名乱数を表示  # -> ぁ
```


## 全カタカナ乱数
引数：なし
説明：カタカナを1文字返します。返すカタカナはUnicodeで0x30A1~0x30FAです。

　[Unicodeはコチラを参考にしました](https://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/u30a0.html)。
　基本的には全平仮名乱数と同じです。ただ、「ヷ」「ヸ」「ヹ」「ヺ」というさっぱり使わない文字にも対応しています。（そんな文字あるんだね・・・）
　拗音を出したい場合はカタカナ乱数をお使いください。

```:全カタカナ乱数
全カタカナ乱数を表示  # -> ゲ
全カタカナ乱数を表示  # -> プ
全カタカナ乱数を表示  # -> ル
```


## 平仮名カタカナランダム変換
引数：Sを|Sの
説明：文字列を1文字ずつ、ランダムにひらがなかカタカナにします。

　ひらがなとカタカナで構成される文字列を引数に与えると、それらをひらがな・カタカナごちゃまぜの文にしてくれます。
　使用例を見ていただければ話は早いと思います。

```:平仮名カタカナランダム変換
「あいうえおカキクケコ」の平仮名カタカナランダム変換を表示  # -> あいウえおカきくケコ
「あいうえおカキクケコ」の平仮名カタカナランダム変換を表示  # -> アイウエオかきクけこ
「あいうえおカキクケコ」の平仮名カタカナランダム変換を表示  # -> あイウエおかきくけコ
```


## 平仮名乱数
引数：なし
説明：ひらがなを1つ返します。全平仮名乱数と違い、拗音は1つとします。
　　　返すひらがなはグローバル変数「実数乱数プラグイン平仮名五十音CSV」を参照してください。

　3つのグローバル変数は次の通りです。

```:実数乱数プラグイン平仮名五十音CSVなど
実数乱数プラグイン平仮名五十音CSV＝「あ,い,う,え,お
か,き,く,け,こ
さ,し,す,せ,そ
た,ち,つ,て,と
な,に,ぬ,ね,の
は,ひ,ふ,へ,ほ
ま,み,む,め,も
や,,ゆ,,よ
ら,り,る,れ,ろ
わ,,,,を
ん,,,,
が,ぎ,ぐ,げ,ご
ざ,じ,ず,ぜ,ぞ
だ,ぢ,づ,で,ど
ば,び,ぶ,べ,ぼ
ぱ,ぴ,ぷ,ぺ,ぽ
きゃ,,きゅ,,きょ
しゃ,,しゅ,,しょ
ちゃ,,ちゅ,,ちょ
にゃ,,にゅ,,にょ
ひゃ,,ひゅ,,ひょ
みゃ,,みゅ,,みょ
りゃ,,りゅ,,りょ
ぎゃ,,ぎゅ,,ぎょ
じゃ,,じゅ,,じょ
びゃ,,びゅ,,びょ
ぴゃ,,ぴゅ,,ぴょ
,,っ,」
実数乱数プラグイン五十音列数=28
実数乱数プラグイン五十音行数=4
```

　こちらがCSV形式になっていますから、このグローバル変数を書き換えていただければ任意の五十音を出力できます。そのときには列数と行数を変えることも忘れないでください。この数字は「実際の列（行）数-1」です。（行数は大体4だろうけど・・・）
　一応、「ふぁ」や「ゔ」、「てぇ」など外来語を表すときぐらいにしか使われない文字は入れていません。あと「ゐ」など最近使わない文字も入れていません。そういう文字が使いたい場合は上の通りグローバル変数を書き換えて使ってくださいね。

```:平仮名乱数
平仮名乱数を表示  # -> びゅ
平仮名乱数を表示  # -> べ
平仮名乱数を表示  # -> じゃ
```

## カタカナ乱数
引数：なし
説明：カタカナを1つ返します。返すカタカナは平仮名乱数に依存します。

　基本的には平仮名乱数と同じです。ただ、平仮名乱数の結果をカタカナに変換しているだけなのでCSVを書き換えたい場合はその辺りにご注意ください。

```:カタカナ乱数
カタカナ乱数を表示  # -> ヒャ
カタカナ乱数を表示  # -> ビ
カタカナ乱数を表示  # -> ジュ
```


## 数字乱数
引数：なし
説明：0~9を1文字返します。

　要するに10の乱数です。

```:数字乱数
数字乱数を表示  # -> 5
数字乱数を表示  # -> 5
数字乱数を表示  # -> 8
```


## プラマイランダム変換
引数：Aを|Aの
説明：数字の正負をランダムに設定します。

　数字の引数Aを、ランダムにプラスかマイナスにします。

```:プラマイランダム変換
「100」のプラマイランダム変換の表示  # -> -100
「100」のプラマイランダム変換の表示  # -> 100
「100」のプラマイランダム変換の表示  # -> 100
```


## 小文字アルファベット乱数
引数：なし
説明：小文字の半角アルファベットを1文字返します。

　[Unicodeはコチラを参考にしました](https://www.asahi-net.or.jp/~ax2s-KMTN/ref/unicode/u0000.html)。
　小文字の半角アルファベットを1文字返します。一応の注意ですが、英語で使われるアルファベットのみを対象としており、ウムラウトが付いたりするものは対象外になります。


```:小文字アルファベット乱数
小文字アルファベット乱数を表示  # -> c
小文字アルファベット乱数を表示  # -> z
小文字アルファベット乱数を表示  # -> o
```

## 大文字アルファベット乱数
引数：なし
説明：大文字の半角アルファベットを1文字返します。

　小文字アルファベット乱数と基本一緒です。

```:大文字アルファベット乱数
大文字アルファベット乱数を表示  # -> N
大文字アルファベット乱数を表示  # -> Q
大文字アルファベット乱数を表示  # -> P
```


## 大文字小文字ランダム変換
引数：Sを|Sの
説明：文字列を1文字ずつ、ランダムに大文字か小文字にします。

　基本的には平仮名カタカナランダム変換と同じです。アルファベットで構成された文字列を、1文字ずつ大文字小文字をランダムに変更して返します。

```:大文字小文字ランダム変換
「abcdEFGH」の大文字小文字ランダム変換を表示  # -> abCDEfGh
「abcdEFGH」の大文字小文字ランダム変換を表示  # -> abcDEFGh
「abcdEFGH」の大文字小文字ランダム変換を表示  # -> ABCdEfgh
```


## アルファベット乱数
引数：なし
説明：アルファベットを1文字返します。

　大文字・小文字関係なく1文字のアルファベットを返します。

```:アルファベット乱数
アルファベット乱数を表示  # -> w
アルファベット乱数を表示  # -> P
アルファベット乱数を表示  # -> d
```



# プラグインの使用方法
　なでしこさんでプラグインを使うためには、プラグインを取り込まなければなりません。そのためには「取り込む」関数を使います。
　このプラグインのライブラリ直リンクは「[https://n3s.nadesi.com/plain/ymm_utt_random_numbers_plugin.nako3](https://n3s.nadesi.com/plain/ymm_utt_random_numbers_plugin.nako3)」もしくは「[https://n3s.nadesi.com/index.php?action=plain&page=1941](https://n3s.nadesi.com/index.php?action=plain&page=1941)」となりますので、どちらか好きな方をURLとして指定してください。

```:プラグインの読み込み
!「https://n3s.nadesi.com/plain/ymm_utt_random_numbers_plugin.nako3」を取り込む
```

　プラグインについては[コチラ](https://nadesi.com/v3/doc/index.php?FAQ%2Fplugins&show)をお読みください。



# おわりに
　以上、なでしこさんで実数乱数やらランダムにひらがなを返す関数やら、いろいろな乱数要素を組み込んだプラグインを作ってみました。駆け足記事になってしまってスミマセン。そして現在時刻は12/17 0:07、間に合っていません。スミマ・・・セン・・・！！！！

　プラグインを作った場合、なでしこ3貯蔵庫にて公開することができます。こちらに皆様が作られたプラグインがライブラリという形で公開されています。（[アドカレ2022の3日目になりますお嬢様プラグイン](https://qiita.com/snowdrops89/items/336a223e6ea052ef9688)もこちらに収録されていますね。）

https://n3s.nadesi.com/index.php?action=library

　私は今回初めてプラグインを作ったのですが、基本的にはいつもと同じように関数を定義しまくるだけなので、プラグインを作るのは全然難しくありませんでした！　また、プラグインを作った後は、投稿画面で保存オプションからライブラリ名を入力するだけでプラグインとして公開できます！（できます・・・よね？実際にライブラリページに私の作ったプラグインが表示されているので、これでプラグインとして公開できていると思います。）
　これを読んでいるみなさんもぜひプラグインを作って投稿してみませんか？
![nakoplugin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954343/7b084e75-b60a-9101-bde0-a40ed7488cae.jpeg)

　というわけで、今回の記事はこのあたりで締めたいと思います。みなさんもぜひプラグインを作ってみましょう！　ゆくゆくは貯蔵庫がみんなが作ったプラグインでライブラリが充実して、より簡単に面白くプログラミングができるようになるといいなぁ・・・と願っています！！

　以上、12/17 24:28のユメミノウツツがお送りしました！　またね～！