滝の音

滝の音

名こそ流れてなお聞こえけれ

計算プリントを自動生成する その14_1 3数の計算 (ランダム作成関数)

はじめに

リベンジです。

じつは「3数の計算」はその11で扱いました。
当時は力不足で凍結するに至りましたが
今回は何とかなりそうなので再び着手。

今回は「ランダム作成関数」について書きます。

ランダム作成関数とは

いままでとは全然違う考え方をします。

今までは数値の選び方にかなり気を使っていました。
望んだタイプの答えが出るように各項の値を設定していました。

ただそれだと、演算子が複数入るパターンの計算式をつくるのがめちゃくちゃ大変になります。

なので今回はかなり割り切りました。
適当に計算式を作成して、その答えを求める。
答えの値に不満があれば各項の値を適当に修正して、もう一度答えを求める。
というやり方。

コード

ランダムとはいえ、各項の初期値はなんとなく決められます。
なので今回は各項を正の数で設定します。
値と演算子はランダムで。

Function Int_Rnd_Str(NN) As String
'------------------
'変数の定義
'------------------
 Dim ope() As String    '演算子
 Dim num() As Integer   '数値
 Dim i As Integer       '繰り返しの制御変数
 Dim box As Variant     '演算子決定のアシスト変数
 Dim tmp As Integer     '演算子決定のアシスト変数
 Dim ans As String      '戻り値
'------------------
'opeとnumの配列数を指定
'------------------
 ReDim ope(1 To NN)
 ReDim num(1 To NN)

'------------------
'boxの指定
'------------------
 box = Array("+", "-", "×", "÷")
 
'------------------
'opeとnumの値を指定
'------------------
 For i = 1 To NN - 1
    tmp = Rnd_Num(0, 3)
    If tmp = 3 Then tmp = Rnd_Num(0, 3)
    ope(i) = box(tmp)
 Next
 
 For i = 1 To NN
    num(i) = Rnd_Num(1, 9)
    If num(i) = 1 Then num(i) = Rnd_Num(1, 9)
 Next
 
'------------------
'ansの作成
'------------------
 For i = 1 To NN
    ans = ans & num(i) & ope(i)
 Next
 
 Int_Rnd_Str = ans
End Function

引数「NN」に「項の数」という意味を持たせています。
演算子に「÷」が出た場合、数値に「1」が出た場合は一度だけ再考させています。

まとめ

これでとりあえず「3数の計算式の問題」だけは作れます。
ただし答えがいくつか手動でないと求められないし
答えが不必要に複雑になるかもしれません。

次回はこの「ランダム作成した問題の答え」を出してくれる関数を書きます。