Pythonで正負の数 （加法）の問題を自動作成する方法

Pythonで正負の数 （**加法**）の問題を自動作成する方法を紹介します。

※問題だけ欲しい人は、GitHubのWikiにあるサンプル問題をご覧ください。

https://github.com/AkibaBurari/math/wiki/seifu-kaho

## 準備

あらかじめ、問題作成のための**基本**をおさえておいてください。こちらのページにまとめてあります。


https://qiita.com/akiba_burari/items/f8a11cf0533b889e0af3


## 加法 （一桁）の問題を作成する

まずは最も基本的な **加法（一桁）** の式を作ってみましょう。

中学1年の数学で扱われるのは次のような問題です。

**(+2)+(+7)**
**(+4)+(+3)**
**(-2)+(-4)**
**(-5)+(-8)**

これを、前回までの基本をふまえてコードを書くとこのようになります。

※以下、Pythonのコードになります。

```
import random

a=random.randint(0,9)
b=random.randint(0,9)

o=random.randint(0,9)
p=random.randint(0,9)
q=random.randint(0,9)
r=random.randint(0,9)
s=random.randint(0,9)
t=random.randint(0,9)

c="+"
d="-"

e="("
f=")"

print(e,c,str(a),f,"+",e,c,str(b),f)
print(e,d,str(o),f,"+",e,d,str(p),f)
print(e,c,str(q),f,"+",e,d,str(r),f)
print(e,d,str(s),f,"+",e,c,str(t),f)

#出力結果
#( + 2 ) + ( + 1 )
#( - 5 ) + ( - 1 )
#( + 1 ) + ( - 6 )
#( - 2 ) + ( + 7 )
```

さらに「実行」すると、新しい問題（4題）が出力されます。

自分で数を考える必要がないので非常にラクです。


## 加法 （二桁）の問題を作る

今度は二桁の数を使ってコードを書いてみましょう。

二桁にするには、**random.randint**の引数の値を「9」から「99」変えるだけです。

```
import random

a=random.randint(0,99)
b=random.randint(0,99)

o=random.randint(0,99)
p=random.randint(0,99)
q=random.randint(0,99)
r=random.randint(0,99)
s=random.randint(0,99)
t=random.randint(0,99)

c="+"
d="-"

e="("
f=")"

print(e,c,str(a),f,"+",e,c,str(b),f)
print(e,d,str(o),f,"+",e,d,str(p),f)
print(e,c,str(q),f,"+",e,d,str(r),f)
print(e,d,str(s),f,"+",e,c,str(t),f)

#出力結果
#( + 84 ) + ( + 71 )
#( - 9 ) + ( - 43 )
#( + 14 ) + ( - 36 )
#( - 65 ) + ( + 13 )
```

このようにコードを実行するだけで好きなだけ問題が自動作成されます。




## 加法（小数）の問題を作る

今度は小数を使ったコードを書いてみましょう。

小数を扱うには、roundを使い、小数点の位置を調整する必要がありました。

```
import random

a=random.uniform(0.1,9.9)
b=random.uniform(0.1,9.9)

o=random.uniform(0.1,9.9)
p=random.uniform(0.1,9.9)
q=random.uniform(0.1,9.9)
r=random.uniform(0.1,9.9)
s=random.uniform(0.1,9.9)
t=random.uniform(0.1,9.9)

c="+"
d="-"

e="("
f=")"

print(e,c,round(a, 1),f,"+",e,c,round(b, 1),f)
print(e,d,round(o, 1),f,"+",e,d,round(p, 1),f)
print(e,c,round(q, 1),f,"+",e,d,round(r, 1),f)
print(e,d,round(s, 1),f,"+",e,c,round(t, 1),f)

#出力結果
#( + 0.3 ) + ( + 7.9 )
#( - 2.4 ) + ( - 2.2 )
#( + 9.8 ) + ( - 0.2 )
#( - 6.8 ) + ( + 6.3 )
```

今回は小数の範囲を「0.1」から「9.9」の範囲に限定していますが、uniformの引数を変えることで変更は可能です。

また、round(a, 1)の「1」の部分を「2」や「3」に変えることで小数の範囲を変更することが可能です。



## 加法（分数）の問題を作る

今度は分数を使った問題を作ってみましょう。

まずは2つの分数を作ります。

```
import random

a=random.randint(1,9)
b=random.randint(1,9)

c=random.randint(1,9)
d=random.randint(1,9)

e="{"
f="}"

h="\\frac"
i="-\\frac"

print(h,e,a,f,e,b,f)
print(i,e,c,f,e,d,f)

#出力結果
#\frac { 3 } { 2 }
#-\frac { 1 } { 9 }
```

$$
\frac { 3 } { 2 }
$$

$$
-\frac { 1 } { 9 }
$$

この２つの分数を組み合わせて問題を作っていきます。


```
import random

a=random.randint(1,9)
b=random.randint(1,9)

c=random.randint(1,9)
d=random.randint(1,9)

e="{"
f="}"

h="\\frac"
i="-\\frac"

o="+"

print(o,h,e,a,f,e,b,f,o,h,e,c,f,e,d,f)

print(o,h,e,a,f,e,b,f,i,e,c,f,e,d,f)

print(h,e,a,f,e,b,f,o,i,e,c,f,e,d,f)

print(i,e,a,f,e,b,f,o,i,e,c,f,e,d,f)

#出力結果
#+ \frac { 9 } { 8 } + \frac { 8 } { 7 }
#+ \frac { 9 } { 8 } -\frac { 8 } { 7 }
#\frac { 9 } { 8 } + -\frac { 8 } { 7 }
#-\frac { 9 } { 8 } + -\frac { 8 } { 7 }
```

$$
+\frac { 9 } { 8 } + \frac { 8 } { 7 }
$$

$$
+\frac { 9 } { 8 } -\frac { 8 } { 7 }
$$

$$
\frac { 9 } { 8 } + -\frac { 8 } { 7 }
$$

$$
-\frac { 9 } { 8 } + -\frac { 8 } { 7 }
$$


後は、変数を増やして数字がかぶらないようにするだけで問題が出来上がります。


```
import random

a=random.randint(1,9)
b=random.randint(1,9)

c=random.randint(1,9)
d=random.randint(1,9)

g=random.randint(1,9)
j=random.randint(1,9)
k=random.randint(1,9)
z=random.randint(1,9)

p=random.randint(1,9)
q=random.randint(1,9)
r=random.randint(1,9)
s=random.randint(1,9)

t=random.randint(1,9)
u=random.randint(1,9)
v=random.randint(1,9)
w=random.randint(1,9)



e="{"
f="}"

h="\\frac"
i="-\\frac"

o="+"

print(o,h,e,a,f,e,b,f,o,h,e,c,f,e,d,f)

print(o,h,e,g,f,e,z,f,i,e,j,f,e,k,f)

print(h,e,p,f,e,q,f,o,i,e,r,f,e,s,f)

print(i,e,t,f,e,u,f,o,i,e,v,f,e,w,f)

#出力結果
#+ \frac { 3 } { 4 } + \frac { 7 } { 4 }
#+ \frac { 7 } { 9 } -\frac { 8 } { 1 }
#\frac { 2 } { 5 } + -\frac { 5 } { 4 }
#-\frac { 6 } { 9 } + -\frac { 4 } { 8 }
```

$$
+\frac { 3 } { 4 } + \frac { 7 } { 4 }
$$

$$
+\frac { 7 } { 9 } -\frac { 8 } { 1 }
$$

$$
\frac { 2 } { 5 } + -\frac { 5 } { 4 }
$$

$$
-\frac { 6 } { 9 } + -\frac { 4 } { 8 }
$$

## 問題のサンプル

GitHubのWikiに作成したサンプル問題を掲載しています。参考にしてください。

https://github.com/AkibaBurari/math/wiki/seifu-kaho


## 最後に

今回はPythonで正負の数「**加法**」の問題を自動作成する方法を紹介しました。

中学の1年で習う内容をもとに問題を作成しましたが、同じ方法を使えば、入試問題レベルの問題も作成できます。

数や引数の値を変えて自分でいろいろと試してみてください。

次回は正負の数「**減法**」を取り上げる予定です。

なお、問題の「解答」はPythonで簡単に作成できます。こちらの記事を参考にしてください。

**Python で計算する準備　足し算・引き算・掛け算・割り算・分数・累乗 - Qiita https://qiita.com/akiba_burari/items/5bb4c083b30768a33aa1**

## この記事の続き

この記事の続きはこちら。

https://qiita.com/akiba_burari/items/3948eef74dd9f9b100ba


## 関連記事

https://qiita.com/akiba_burari/items/f8a11cf0533b889e0af3

https://qiita.com/akiba_burari/items/954f832b408fef353aa3

https://qiita.com/akiba_burari/items/d185a2224c7bb87e5cdf

https://qiita.com/akiba_burari/items/55ddae0c065fdccdef16

https://qiita.com/akiba_burari/items/5bb4c083b30768a33aa1