1. Home

  2. /
  3. プログラミング
  4. /
  5. pythonで簡単プログラミング
  6. /
  7. 【その他】python : 適当な数(ランダムな数/乱数)を発生させる

【その他】python : 適当な数(ランダムな数/乱数)を発生させる

乱数 pythonで簡単プログラミング

#python #ランダム #適当な数 #乱数 #randint #random #randrange #uniform

この記事では、pythonにおいて、適当な数、つまり ランダム な数(乱数)を発生させる方法について、わかりやすく解説します。

本記事では、主としてWindows、および、python3を前提にしています。

本記事を読むにあたって

本記事内のプログラムを実践するには、下記の記事に従って環境を準備してください。

・ 【第2回】pythonのプログラミング環境を作る

乱数とは

乱数とは、刻々と不規則に(ランダムに)変わる数のことを言います。

pythonにおける乱数には、以下のrandomモジュールとsecretsモジュールの2種類があります。

・ 疑似乱数(randomモジュール)
・ 機密用途向けの安全な乱数(secretsモジュール)

本記事では、randomモジュールについてのみ解説します。

疑似乱数は、時刻に基づいて生成されます。
内部では、精度の高い小数で生成されますが、実際に使用する時には整数に変換するなどの計算が必要となります。

~から~までの整数の乱数を発生させる(randint関数)

ある値の範囲の整数の乱数を発生させるには、randomモジュールを インポート した後に、randint関数を使うことで発生させることができます。
以下に例を示します。

<random.py>

import random as rd         # randomモジュールを"rd"としてインポート

print( rd.randint(0,10) )   # randint関数で0~10の整数乱数を発生させる

実行すると以下のようになります。
以下では3回実行しています。

(base) PS D:\blog\random> python .\random.py
9
(base) PS D:\blog\random> python .\random.py
10
(base) PS D:\blog\random> python .\random.py
8

上記のように毎回実行の度に数値が不規則に変化します。

~から~までとびとびの整数乱数を発生させる(randrange関数)

ある値の範囲で偶数・奇数などの、とびとびの整数乱数を発生させるには、randrange関数を使うことで発生させることができます。
以下に例を示します。

<random.py>

import random as rd         # randomモジュールを"rd"としてインポート

print( rd.randrange(0,10,2) )  # randrange関数で0~10の偶数の整数乱数を発生させる

実行すると以下のようになります。
以下では3回実行しています。

(base) PS D:\blog\random> python .\random.py
2
(base) PS D:\blog\random> python .\random.py
0
(base) PS D:\blog\random> python .\random.py
4

0~1.0までの小数乱数を発生させる(random関数)

0~1.0までの小数乱数を発生させるには、random関数を使用します。

<random.py>

import random as rd         # randomモジュールを"rd"としてインポート

print( rd.random() )        # random関数で0~1.0の小数乱数を発生させる

実行すると以下のようになります。

(base) PS D:\blog\random> python .\random.py
0.8970474052366745
(base) PS D:\blog\random> python .\random.py
0.5876635418178434
(base) PS D:\blog\random> python .\random.py
0.4801309993737235
(base) PS D:\blog\random> python .\random.py
0.20795871140514655

~から~までの小数乱数を発生させる(uniform関数)

指定した範囲の小数乱数を発生させるには、uniform関数を使用します。

<random.py>

import random as rd         # randomモジュールを"rd"としてインポート

print( rd.uniform(0,5) )     # uniform関数で0~5の小数乱数を発生させる

実行すると以下のようになります。

(base) PS D:\blog\random> python .\random.py
4.632164932332833
(base) PS D:\blog\random> python .\random.py
2.034281244804041
(base) PS D:\blog\random> python .\random.py
3.4502427813735266

重複なく乱数を発生させる

ここまでは、乱数を発生させる方法について解説しましたが、乱数は何度も同じ数値が重複して発生する可能性があります。
このままでは、例えばくじ引きのようなアプリを作成するときには不都合となります。

残念ながら乱数を重複なく発生させる簡単な方法はありませんが、乱数を発生させた後に重複なく出力することはできます。

いくつか方法はありますが、最も簡単でわかりやすい方法は、以下の方法になります。
処理の内容はプログラム中のコメントをご参照ください。

<unique_random.py>

import random as rd             # randomモジュールを"rd"としてインポート

done_list = []                  # 処理済みリストを初期化する

while True :                        # 無限ループする
    randval = rd.randint(1,5)       # randint関数で1~5の整数乱数を発生させる

    if randval not in done_list :   # 処理済みリストに乱数が未追加の場合
        print( randval )            # 乱数を表示する
        done_list.append(randval)   # 乱数を処理済みリストに追加する

        if len(done_list) == 5 :    # 処理済みリストの内容が5つになったら
            break                   # 無限ループを抜ける

リスト とは、[ 1, 2, 3, 4 ]のように値を並べただけの構造のことです。
上の例では、変数done_listを空のリストで初期化し、append関数でリストに乱数を追加しています。
リストに追加した乱数の個数は、len関数でわかります。

ループについては、乱数が重複することがあるため、何回ループすればよいかが事前にわかりません。
そのため”while True :”で無限ループにしています。
Trueについては、”【特殊な値】pythonにおける真偽値とは何か”を参照してください。

“if randval not in done_list :”によって、処理済みリストに乱数が未だ追加されていないかを判定しています。
“not in”は含まないことを判定します。
if文の詳細は”【基本】python : 条件判定文(if)の使用パターンと使用例“を参照してください。

実行すると以下のようになります。

(base) PS D:\blog\random> python .\unique_random.py                                                     2
3
5
4
1

なお、発生させる乱数が少ない間は上記の方法で良いのですが、何万もの重複しない乱数を発生させる場合には、後になるにしたがって、重複する回数が多くなって空振りが多くなり、答えを出すのに時間がかかってしまいます。
この問題を解決するには、上記とは全く異なる方法で行う必要がありますが、これについては、まだ執筆していない別の記事で解説します。

もう一度同じ乱数を発生させる

ここまでの方法では、プログラムを実行する度に乱数は変わります。
本来の乱数の意味からすると、当然これは良いことです。
しかし、時には、一度発生させた乱数をもう一度発生させたいことがあります。

これは、 シード と呼ぶ乱数の種を設定することで可能になります。
以下に例を示します。

<seed.py>

import random as rd         # randomモジュールを"rd"としてインポート

rd.seed(1)                  # 乱数の種(シード)を1にする
print( rd.randint(0,10) )   # randint関数で0~10の整数乱数を発生させる
print( rd.randint(0,10) )   # randint関数で0~10の整数乱数を発生させる
print( rd.randint(0,10) )   # randint関数で0~10の整数乱数を発生させる

3回実行すると以下のようになります。
3回とも同じ順で同じ乱数が発生しています。

(base) PS D:\blog\random> python .\seed.py
2
9
1
(base) PS D:\blog\random> python .\seed.py
2
9
1
(base) PS D:\blog\random> python .\seed.py
2
9
1

最後に

本記事では、 ランダム に変化する乱数の発生方法について解説しました。

1.~から~までの整数の乱数を発生させる(randint関数)
2.~から~までとびとびの整数乱数を発生させる(randrange関数)
3.0~1.0までの小数乱数を発生させる(random関数)
4.~から~までの小数乱数を発生させる(uniform関数)

また、以下のような方法についても解説しました。

・ 重複なく乱数を発生させる
・ もう一度同じ乱数を発生させる

乱数には、他にも正規分布、ガウス分布に従った乱数など、いくつかありますが、通常の利用方法であれば、以上を押さえていれば、用が足りると思います。

次回は別の基本について解説しますので、ご期待ください!

この記事へのお問い合わせや、無料のサポート、一歩踏み込んだ有料サポートが必要な場合は、ホームページからメールで受け付けています。お気軽にご連絡ください。

コメント

タイトルとURLをコピーしました