IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第16回 randomを使ってゲームを作ろう!~4桁のランダムな数字を出す方法~ (菱沼佑香) 2021年1月

吉政創成 アシスタントの菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。

さて、前回からヒット&ブローという数字当てゲームを作っていくということで、まずは1桁で作成してみました。最終的に4桁のヒット&ブローを作ることになりますが、今回は4桁のランダムな数字の作り方を学びます。

まずはおさらい 1桁verの作り方

fig01

こちらは前回使用した画像です。
randomというモジュールをインポートした後、randintという関数を使って0~9までの数字の中からランダムにコンピュータに数字を選択させます。その後、回答者が考えた数字を入力し、あたりかはずれかを出力します。ここでは何の数字をコンピュータが選択したのかがわかるように回答する前に表示されるよう、[ print(a) ]を記述しています。表示させないようにするにはこの行を削除してあげればOKです。

4桁のランダムな数字出すにはどうすればいい?

同じようにrandomを使って、4桁分の設定をしてあげればいいようです。

fig02

(左は冒頭の振り返り用に出した1桁の設定画像からとってきています。)
中央が4桁のランダムな数字を出すための記述です(あてっこクイズ部分はまだ記述されていません。)
左と中央の画像内、赤線を見て頂くとわかる通り、変数名はちがうものの、処理内容は同じです。ランダムな4桁の数字を出すにはこれを桁数分書いてあげ、青線のように[ print ]で繋げてあげればいいようです。違うのは[ str ](文字列変換)が追記されていることです。

引用-----
P.129
このプログラムで注意したいところは、9行目の「print(str(a1) + str(a2) + str(a3) + str(a4))」の部分です。「a1」「a2」「a3」「a4」が数値なので、このまま足してしまうと、4つの数の合計が求められてしまいます。ここでやりたいのは、連結して表示したいということなので、「str」で文字列に変換して実行しなければなりません。
------

たしかに、そのままでは足し算になりますね...。というわけで、文字列に変換すればくっつけてあげられるから、[ str ]を付けてあげる、ということになります。

単純に4桁のランダムな数字を出したい

こんな方法があるそうです。

引用-----
P.131
>>> a = random.randint(0,9999)
この方法でもよいのですが、ヒット&ブローでは4桁の「それぞれの桁の数字」の数当てゲームなので、こうして作った場合は「1000の桁」「100の桁」「10の桁」「1の桁」を、取り出さなければならなくなります。
そうした手間を考えると、それぞれの桁を別々に管理して、表示するときに連結した方がプログラムを考えるのが簡単になるので、ここでは4つを別々に計算するようにしています。
------

というわけで一応やってみました。4桁、5桁、6桁としてみましたが、確かにそれぞれの桁数はきちんとランダムな数字が表示されました。

fig03

4つの変数を1つの変数で済むようにする方法(リストとインデックスを使う)

さて、前回、シーケンスの話をした際に、リストとインデックス番号の話をしました。この数字当てゲームでもこのリストとインデックスを使う方法があるのだそうです。その方法と先ほどの方法を図にして横に並べてみました。

fig04

(※右:実際は一度、aという箱に値はそのまま格納されますが図では省略しています。格納後、リスト化します。)

左がもともとのやり方、右が新たなやり方です。
もとの方法では、数字を格納するための箱を4つ用意しましたが、新たな方法では4桁の値を投入する箱はaの一つのみです。
箱(a)に投入されたランダムな4桁の値はその後リスト化されます。投入される値はランダムなため、値が確定しているわけではありませんので、表示(print)のための記述にはインデックス番号が指定されています。インデックス番号を指定してあげることで、「[ 0 ]に入っている子を呼んできてちょうだい?」とお願いしていることになります。

リストとインデックス番号の関係は次の通りです。
例1:「 9753 」をリスト化すると、a = [9,7,5,3]、インデックス番号は9=[ 0 ]、7=[ 1 ]、5=[ 2 ]、3=[ 3 ]
例2:「 5634 」をリスト化すると、a = [5,6,3,4]、インデックス番号は5=[ 0 ]、6=[ 1 ]、3=[ 2 ]、4=[ 3 ]

というわけで、リストにすることで4桁の値を4つに分解することができるので、箱がひとつしかなくても、問題なく扱うことができます。なぜこうするのかというと、管理が楽になるということが大きいようです。

引用-----
P.134
入力された数字を、後でヒットかブローかと判定していくことを考えた場合、答えとなるランダムな数字をリストとして4つにわけたように、入力された4桁の文字も、それぞれの文字を4つに分けて管理すると処理が楽になります。
------

元のやり方ではそれぞれの値を格納するための箱を用意してあげる必要があったので、10桁だと10個用意しなくてはならず、場合によっては煩雑になりますし、なにより、いちいち変数名を指定してあげないといけないので面倒でした。ひとつにすることで管理が楽になることもそうですが、その分の記述も減らすことができますね。

randomでやりたいこんなこと

ヒット&ブローとは関係ありませんが、こんな使い方もできるそうです。まずはやってみた画像から。

fig05

3つやってみましたが、それぞれの意味は次の通りです。

①リストから二つランダムで選びたい
その場合は[ k=(個数) ]を追記してあげればいいそうです。
>>> random.choices(isono,k=個数)

②リストの並びを適当にシャッフルしたい
>>> random.shuffle(リストの名前)
>>> print(リストの名前)

③0から始まる数字にしたい(ゼロ埋めしたい)
記述方法が違うものを二種類見つけました。どちらも任意の書式を設定するformatを利用していて、書き方が少し違うという感じです。

1)>>>format(random.randrange(10000),"04")
random.randrangeで指定しているのが10,000以下の値(=9999)です。そのあとに続く"04"は0から始まる4桁という意味だと思います。ここを05にすると、01234のように0から始まる5桁になりました。つまり、4桁と5桁とか、元となる数字の桁数は違うけど、桁数を揃えたいという場合にはこのような書き方をしてあげれば桁数がそろうということのようです。品番とかで使い道がありそうですね。

2)>>>"{:0>4}".format(random.randrange(10000))
こちらも同じくrandom.randrangeで指定しているのが10,000以下の値(=9999)です。
"{:0>4}" この部分で桁数と最初の数字を指定しているようです。こちらもまた、4を5に変えれば01234となりました。

このあたりの参考になりそうな参考サイトは以下になります。詳しく知りたい方はご一読ください。
pythonによる4桁乱数(ユニーク生成)について
Pythonで文字列・数値をゼロ埋め(ゼロパディング)
Pythonの文字列フォーマット(formatメソッドの使い方)
Pythonで0埋めをして桁数を揃える方法

では、きりが良いので、今回はここでおしまいです。次回は入力エラーの判定の設定方法を学びます。

その他参考サイト

ランダムに出力!Pythonでrandomを使う方法【初心者向け】

【Python】リストや文字列の要素をランダムに抽出する(random.choice, choices, sample)

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes