こんにちは、晶(あき)です。
Pythonエンジニア認定基礎試験の勉強中、ランダムな値を取り出す問題で見事に引っかかりました。
問題は、サイコロの目として「1以上6以下の整数」をランダムに一つ取得するというものです。
import random
random.★★★(1, 6)
ここに入るのは何か、という問題でした。
正解は、こちらです。
random.randint(1, 6)
ところが私は、sampleを選びそうになりました。
サイコロの目なら同じ数字が重複しないように選ぶのかな、と思ってしまったんです。
でも、よく考えたらサイコロは振るたびに同じ目が出てもいいんですよね。
今回は、初心者の私が混乱したrandintとsampleの違いを、自分用の復習も兼ねてまとめます。
random.randintは整数を一つ選ぶ
random.randint(a, b)は、a以上b以下の整数から、ランダムに一つ返します。
import random
number = random.randint(1, 6)
print(number)
この場合は、1・2・3・4・5・6のどれか一つが表示されます。
大事なのは、両端の数字を含むことです。
random.randint(1, 6)
なら、1も6も出る可能性があります。
サイコロの目を一つ出したいときに、ちょうどいい書き方です。
何度も実行すれば、同じ数字が続けて出ることもあります。
3
3
5
1
サイコロなので、3の次にまた3が出ても問題ありません。
random.sampleは重複なしで複数選ぶ
一方のrandom.sample()は、複数の候補から指定した個数を、重複なしで取り出すときに使います。
import random
numbers = random.sample(range(1, 7), 3)
print(numbers)
実行結果は、次のようになります。
[2, 6, 4]
1から6までの数字の中から、重複しない3個が選ばれています。
同じ数字を重ねずに、いくつかまとめて選びたいときに使うものです。
たとえば、くじ引きで当選者を3人選ぶようなイメージです。
randintとsampleの違い
違いを簡単にまとめると、次のようになります。
| 関数 | できること | 戻り値の例 | 重複 |
|---|---|---|---|
random.randint(1, 6) | 範囲内の整数を一つ選ぶ | 4 | 繰り返し実行すれば同じ値も出る |
random.sample(range(1, 7), 3) | 候補から複数個を選ぶ | [2, 6, 4] | 同じ結果の中では重複しない |
一つの整数がほしいならrandint。
重複なしで複数個を取り出したいならsampleです。
「sample」という字面に引っ張られた
私が間違えた原因は、sampleという名前に引っ張られたことでした。
「サンプル」と聞くと、候補を一通り目の前に並べて、そこから選んでくれるようなイメージがありませんか。
私はそのイメージに引っかかってしまいました。
しかも、サイコロの目は1から6までなので、
「6個の候補からランダムに選ぶならsampleかな?」
と考えてしまったんです。
でも今回ほしいのは、候補の一覧ではなく、1から6までの整数のうち一つだけです。
そこで、次のように覚え直しました。
intはinteger、つまり整数。
randintは、範囲内の整数をランダムに一つ出す。
randとintに分けて考えると、かなり分かりやすくなりました。
「整数をきれいに並べた範囲から、一つ取り出す」というイメージで覚えています。
サイコロでsampleを使うなら書き方が違う
sampleを使って、1から6までの数字から一つ選ぶこと自体は可能です。
random.sample(range(1, 7), 1)
ただし、結果は整数ではなく、要素が一つ入ったリストになります。
[4]
今回の問題で求めているのは、次のような一つの整数です。
4
そのため、サイコロの目を一つ取得するなら、素直にrandintを使うのが分かりやすいです。
random.randint(1, 6)
試験問題では「ランダム」という言葉だけで判断せず、何を何個、どんな形で取得したいのかを確認する必要があるんですね。
問題文で確認したいポイント
同じような問題が出たら、次の点を確認しようと思います。
- 整数を一つ取得するのか
- 複数の値を取得するのか
- 重複してもよいのか
- 戻り値は整数なのか、リストなのか
- 範囲の両端を含むのか
特に今回は、「サイコロ」という言葉から勝手に難しく考えてしまいました。
サイコロを一回振るなら、必要なのは1以上6以下の整数が一つ。
そこまで分かれば、randintにたどり着けます。
まとめ
最後に、今回覚え直したことをまとめます。
random.randint(a, b)は、a以上b以下の整数を一つ返すrandom.sample()は、候補から重複なしで複数個を選ぶrandintのintはinteger(整数)- サイコロを一回振るなら
random.randint(1, 6) - 関数名のイメージだけでなく、戻り値の形も確認する
最初は「サイコロだから数字が重複しないようにsampleかな」と考えてしまいました。
でも、サイコロは同じ目が続けて出ても問題ありません。
intは整数。
そこに気づけば、とてもシンプルな問題でした。
知っていれば一瞬で解ける問題でも、知らないと余計なイメージに引っ張られてしまいますね。
今回しっかり間違えたので、次はたぶん大丈夫です。
同じところで迷ったPython初心者の参考になればうれしいです。
あわせて読みたい
Pythonの勉強を始めた理由や、初心者として感じたことはこちらにまとめています。
読んでくれてありがとう。
また気が向いたら遊びに来てください。


コメント