Turtleグラフィックス③ 乱数と条件分岐

Image from Gyazo

乱数と条件分岐

Turtleグラフィックスを利用して, 乱数条件分岐 の仕組みに関して学習しましょう. 乱数とはランダムに生成された数値のことであり,偶発性の表現が必要なシミュレーションやゲームにおいて利用されます. コンピュータで真の乱数を生成することは困難なため,確定的な計算手法で算出される疑似乱数が用いられます(規則性が存在する). また,指定した条件に応じて実行するプログラムを切り替えるための制御が条件分岐です. 条件分岐は,前回学習した繰り返しと同様に,Pythonに限らず一般的なプログラミング言語においても重要な機能です.

Image from Gyazo

準備

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グラフィックスを描画してみましょう. 変数xyに乱数を代入して,直径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)

Image from Gyazo

次に,変数xyに正規分布に従った乱数を代入して,直径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)

Image from Gyazo

条件分岐

指定した条件に応じて,実行するプログラムを切り替えることができます. 条件は 比較演算子論理演算子 を用いて 条件式 として記述します.

比較演算子

比較演算子を次の表にまとめます. 表中のxyには,数値リテラルや文字列リテラル,または,それらを代入した変数を用いることができます. 比較演算子の結果は 真理値 と呼ばれる形式となります. 真理値は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")

論理演算子

複数の条件を組み合わせた新しい条件を表現するには 論理演算子 を用います. 論理演算子を次の表にまとめます. 表中のxyには,真理値,または,それらを代入した変数を用いることができます. 論理演算子の結果は,比較演算子と同じように 真理値 です.

論理演算子 説明
x and y 論理積(かつ)
x or y 論理和(または)
not x 否定

論理積はxyがいずれもTrueのときに,演算結果がTrueになります.

# 論理積
print(True and True) # -> True
print(True and False) # -> False
print(False and True) # -> False
print(False and False) # -> False

論理和はxyがいずれも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のときだけ,インデント(字下げ)された処理を実行します. ここでは,自然数xyを比較して,xyより大きいときだけ出力してみます.

# xとyは自然数
x = 5
y = 3
if x > y:
    print(f"{x}{y}より大きい")

elseを用いて,条件式がFalseのときの処理を記述することができます.

if 条件式:
	条件式がTrueのとき実行する処理
else:
	条件式がFalseのとき実行する処理

次のように記述すると,xyの大小関係に応じて,実行するプログラムを切り替えることができます.

# 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のとき実行する処理

次のように記述すると,xyの大小関係に応じて,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)

Image from Gyazo

課題

次の課題に取組んでください.

Image from Gyazo

課題を完成させたらスクリプトを保存し,「chapter4.py」を提出してください.

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.