Turtleグラフィックス③ 乱数と条件分岐
乱数と条件分岐
Turtleグラフィックスを利用して, 乱数 と 条件分岐 の仕組みに関して学習しましょう. 乱数とはランダムに生成された数値のことであり,偶発性の表現が必要なシミュレーションやゲームにおいて利用されます. コンピュータで真の乱数を生成することは困難なため,確定的な計算手法で算出される疑似乱数が用いられます(規則性が存在する). また,指定した条件に応じて実行するプログラムを切り替えるための制御が条件分岐です. 条件分岐は,前回学習した繰り返しと同様に,Pythonに限らず一般的なプログラミング言語においても重要な機能です.
準備
Muエディタを起動したら,Python3 モードを選択しましょう. ツールバーにある「保存」をクリックして,「chapter4.py」という名前でスクリプトを保存します. また,Turtleグラフィックスのライブラリ(モジュール)をインポートしておきましょう.
# Turtleグラフィックスのライブラリをインポート
from turtle import *
乱数
乱数を生成するにはPythonの標準モジュールであるrandom をインポートします. Pythonにおいて, モジュール とはインポートされるファイル(.py)のことを指しています. 一方で,ライブラリ とは複数のモジュールをまとめてインストールできる機能のことを指します. 実際には厳密にモジュールとライブラリを区別しないことも多いので注意しましょう.
# 乱数生成のためのモジュールをインポート
from random import *
0以上1未満の乱数
0以上1未満の 一様分布 に従った実数(小数)を生成するには random()
を用います.
# 0以上1未満の乱数
for i in range(10):
print(random())
範囲を指定した乱数
範囲を指定して 一様分布 に従った実数(小数)を生成するには uniform(a, b)
を用います.生成される値$x$は,$a \leq x < b$となることに注意してください.
# 1以上5未満を指定した乱数
for i in range(10):
print(uniform(1, 5))
範囲を指定した乱数(整数)
範囲を指定して 一様分布 に従った整数を生成するには randint(a, b)
を用います.生成される値$x$は,$a \leq x \leq b$となることに注意してください.
# 1以上5以下を指定した乱数(整数)
for i in range(10):
print(randint(1, 5))
正規分布に従う乱数
平均mu
と標準偏差sigma
を指定して 正規分布 に従った実数(小数)を生成するには normalvariate(mu,sigma)
を用います.
# 平均0,標準偏差5の正規分布に従う乱数
for i in range(10):
print(normalvariate(0, 5))
乱数を活用した描画
乱数を活用してTurtleグラフィックスを描画してみましょう.
変数x
とy
に乱数を代入して,直径10の点(ドット)を描きます.
乱数は-300から300までの一様分布とします.
また,点を描くにはdot()
を用います.
speed(0)
for i in range(100):
penup()
x = uniform(-300, 300)
y = uniform(-300, 300)
goto(x, y)
pendown()
dot(10)
次に,変数x
とy
に正規分布に従った乱数を代入して,直径10の点(ドット)を描きます.
正規分布は平均0,標準偏差100とします.
speed(0)
for i in range(100):
penup()
x = normalvariate(0, 100)
y = normalvariate(0, 100)
goto(x, y)
pendown()
dot(10)
条件分岐
指定した条件に応じて,実行するプログラムを切り替えることができます. 条件は 比較演算子 と 論理演算子 を用いて 条件式 として記述します.
比較演算子
比較演算子を次の表にまとめます.
表中のx
とy
には,数値リテラルや文字列リテラル,または,それらを代入した変数を用いることができます.
比較演算子の結果は 真理値 と呼ばれる形式となります.
真理値はTrue
またはFalse
の2値のいずれかとなります(先頭の文字が大文字となることに注意すること).
比較演算子 | 説明 |
---|---|
x == y |
xとyは等しい |
x != y |
xとyは等しくない |
x > y |
xはyより大きい |
x >= y |
xはyより大きいか等しい |
x < y |
xはyより小さい |
x <= y |
xはyより小さいか等しい |
数値リテラルを対象に比較演算子を適用してみます.
# 数値と比較演算子
x = 3
print(x == 3) # -> True
print(x != 3) # -> False
print(x > 3) # -> False
print(x >= 3) # -> True
print(x < 4) # -> True
print(x <= 2) # -> False
文字列リテラルを対象に比較演算子を適用してみます.
# 文字列と比較演算子
x = "A"
print(x == "B") # -> False
print(x != "B") # -> True
例題1
文字列リテラルに大小関係を比較する<
や>
を適用するとどうなるか調べてください.
# 文字列と比較演算子
print(x > "B")
print(x >= "B")
print(x < "B")
print(x <= "B")
論理演算子
複数の条件を組み合わせた新しい条件を表現するには 論理演算子 を用います.
論理演算子を次の表にまとめます.
表中のx
とy
には,真理値,または,それらを代入した変数を用いることができます.
論理演算子の結果は,比較演算子と同じように 真理値 です.
論理演算子 | 説明 |
---|---|
x and y |
論理積(かつ) |
x or y |
論理和(または) |
not x |
否定 |
論理積はx
とy
がいずれもTrue
のときに,演算結果がTrue
になります.
# 論理積
print(True and True) # -> True
print(True and False) # -> False
print(False and True) # -> False
print(False and False) # -> False
論理和はx
とy
がいずれもFlase
のときに,演算結果がFalse
になります.
# 論理和
print(True or True) # -> True
print(True or False) # -> True
print(False or True) # -> True
print(False or False) # -> False
否定はx
の値を反転します.
# 否定
print(not(True)) # -> False
print(not(False)) # -> True
例題2
条件式とは結果が真理値(TrueまたはFalse)になる演算式のことを指します. 次に示す比較演算子と論理演算子を用いた条件式の結果を確認してください.
x = 20
y = 30
print((x > 10) and (y <= 30))
print((x > 20) or (y < 40))
print(not(x != 20) and not(y == 30))
if文
条件式を指定して,実行するプログラムを切り替えるには if文 を用います. if文は条件式を用いて次のように記述します.
if 条件式:
条件式がTrueのとき実行する処理
条件式がTrue
のときだけ,インデント(字下げ)された処理を実行します.
ここでは,自然数x
とy
を比較して,x
がy
より大きいときだけ出力してみます.
# xとyは自然数
x = 5
y = 3
if x > y:
print(f"{x}は{y}より大きい")
else
を用いて,条件式がFalse
のときの処理を記述することができます.
if 条件式:
条件式がTrueのとき実行する処理
else:
条件式がFalseのとき実行する処理
次のように記述すると,x
とy
の大小関係に応じて,実行するプログラムを切り替えることができます.
# xとyは自然数
x = 3
y = 5
if x > y:
print(f"{x}は{y}より大きい")
else:
print(f"{x}は{y}より小さい")
さらに,elif
を用いて,複数の条件式を記述することができます.
if 条件式1:
条件式がTrueのとき実行する処理
elif 条件式2:
条件式2がTrueのとき実行する処理
else:
条件式1と条件式2がFalseのとき実行する処理
次のように記述すると,x
とy
の大小関係に応じて,3つに分岐してプログラムを実行することができます.
# xとyは自然数
x = 3
y = 3
if x > y:
print(f"{x}は{y}より大きい")
elif x < y:
print(f"{x}は{y}より小さい")
else:
print(f"{x}と{y}は等しい")
if文を活用した描画
if文を活用してTurtleグラフィックスを描画してみましょう.
タートルのx座標が0より大きいときだけ,ドットを赤色で描きます.
ここで,position()
の結果はリストであり,
参照番号0がx座標,1がy座標を表すことに注意してください.
speed(0)
for i in range(100):
penup()
x = uniform(-300, 300)
y = uniform(-300, 300)
goto(x, y)
pendown()
if position()[0] > 0:
color("red")
dot(10)
else:
color("black")
dot(10)
課題
次の課題に取組んでください.
- 図を参考にif文を利用してドットを4色に塗り分ける
- 色は赤,青,緑,ピンクの4色
課題を完成させたらスクリプトを保存し,「chapter4.py」を提出してください.