Python PR

【Python】重複しない乱数の生成方法

記事内に商品プロモーションを含む場合があります

この記事では、重複しない乱数のイテラブルを生成する方法を紹介します。

乱数を生成するには randomモジュール の randint()関数を使います。

import random

random.randint(a, b)

randomモジュールを使った乱数の使い方を解説

それでは、重複しない乱数の生成方法を見ていきましょう!

重複しない乱数

生成した set が指定した長さになるまで乱数を追加し続けることで重複した要素を取り除いたイテラブルを生成することができます。

def rand_nodup(a, b, k):
    r = set()
    while len(r) < k:
        r.add(random.randint(a, b))
    return r


print(rand_nodup(-5, 10, 5))

実行結果

[1, 3, 7, -4, -2]

しかし、このままでは範囲以上の個数(k)が指定されると無限ループしてしまう。なので、範囲以上の個数が指定された際は ValueError を投げるようにしましょう。

def rand_nodup(a, b, k):
    if abs(a) + b < k:
        raise ValueError
    r = set()
    while len(r) < k:
        r.add(random.randint(a, b))
    return r

また、randomモジュール の sample()関数 を使うことでも要素が重複しないリストを生成できます。

import random

print(random.sample(range(5), 5))

実行結果

[1, 4, 2, 0, 3]

Linkrandom.sample() — Python ドキュメント

同じ値が連続しない乱数

同じ乱数が連続しないようにするには、生成した乱数と末尾の要素を比較し、異なる値のみ追加することで実現できます。

def rand_nocon(a, b, k):
    r = [random.randint(a, b)]
    while len(r) < k:
        n = random.randint(a, b)
        if r[-1] != n:
            r.append(n)
    return r


print(rand_nocon(0, 1, 10))

実行結果

[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

random.randint() を 2回使っているのが気になる場合は or を使っても良い。

def rand_nocon(a, b, k):
    r = []
    while len(r) < k:
        n = random.randint(a, b)
        if not len(r) or r[-1] != n:
            r.append(n)
    return r

まとめ

この記事では、Python で重複しない乱数を生成する方法を解説しました。

文字列や他のオブジェクトで同じことがしたい場合は、random.choice() を使って同じように実装できます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ