Python PR

【Python】おみくじを実装してみる【サンプルプログラム】

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

この記事では、Pythonでおみくじを実装してみます。

任意の種類のくじを用意してくじごとに引ける確率を変えましょう。また、くじだけでは少し寂しいので恋愛運などの運勢も追加で取得できるようにしましょう。

それでは、おみくじを実装していきましょう!

くじをランダムに取得する

それではさっそくシンプルなおみくじを実装していきましょう。

くじの用意

まずはくじを用意します。

lots = ('大吉', '中吉', '吉', '末吉', '凶')

途中で変更しないのでリストではなくタプルで用意しましょう。

乱数の生成

randomモジュール の randrange()関数 でくじの範囲の乱数を生成します。

import random

randint = random.randrange(0, len(lots))

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

くじの取得

先ほど生成した乱数を使ってくじを取得します。

lot = lots[randint]

くじの出力

最後に取得したくじを出力しましょう。

print(lot)

使ってみる

以下のようなソースコードになりました。何度も実行してみてください。

import random

lots = ('大吉', '中吉', '吉', '末吉', '凶')

randint = random.randrange(0, len(lots))
lot = lots[randint]

print(lot)

実行結果

中吉

簡単なおみくじを実装することができました。

くじによって確率を変える

このままでは味気ないのでくじによって引ける確率を変更しましょう。確率を変更するには色々な方法がありますが、今回は以下のような関数を使います。

from bisect import bisect

def prob_choice(items, weights):
    total = weights[-1]
    hi = len(items) - 1
    return items[bisect(weights, random.random() * total, 0, hi)]

items引数 に イテラブルを指定し、weights引数 に確率を累積的に指定します。例えば、a, b, c を 10%, 60%, 30% で取得したい場合は以下のようにします。

items = ('a', 'b', 'c')
weights = (10, 70, 100)

prob_choice(items, weights)

以下では、大吉と凶を 10%、末吉と中吉を 20%、吉を 40%で取得しています。確認として collections.Counterクラス で 1000回の結果を集計しています。

import random
from  bisect import bisect

lots = ('大吉', '中吉', '吉', '末吉', '凶')
weights = (10, 30, 70, 90 ,100)


def prob_choice(items, weights):
    total = weights[-1]
    hi = len(items) - 1
    return items[bisect(weights, random.random() * total, 0, hi)]

# 確認用のカウンター
from collections import Counter

# 1000回くじ引きしてみる
print(Counter([prob_choice(lots, weights) for _ in range(1000)]))

実行結果

Counter({'吉': 404, '中吉': 198, '末吉': 185, '凶': 114, '大吉': 99})

おおむね確率通りに引けているのが確認できました。これで任意の確率を定めたおみくじを実装することができました。

運勢の実装

確率を変えてくじを引けるようになりましたが取得できる情報が少なくて寂しいですね。なので、恋愛、仕事、健康の運勢も星の数でわかるようにしてみましょう。

くじに意味を持たせるために引いたくじの種類によって取得する運勢の確率を変えます。

# 運勢一覧
fortunes = ('恋愛', '仕事', '健康')

# くじごとの運勢の取得確率
fortune_weights = {
    '大吉': (10, 20, 50, 80, 100),
    '中吉': (10, 30, 60, 90, 100),
    '吉': (20, 40, 60, 80, 100),
    '末吉': (20, 50, 70, 90, 100),
    '凶': (20, 60, 80, 90, 100),
}


def main():
    # くじを引く
    result = prob_choice(lots, weights)

    # くじの出力
    print(result)

    # 運勢ごとに抽選
    for fortune in fortunes:
        print(f'{fortune}: {"☆" * prob_choice((1, 2, 3, 4, 5), fortune_weights[result])}')


if __name__ == '__main__':
    main()

実際のコードは以下のようになりました。

import random
from bisect import bisect

lots = ('大吉', '中吉', '吉', '末吉', '凶')
weights = (10, 30, 70, 90 ,100)

# 運勢一覧
fortunes = ('恋愛', '仕事', '健康')

# くじごとの運勢の取得確率
fortune_weights = {
    '大吉': (10, 20, 50, 80, 100),
    '中吉': (10, 30, 60, 90, 100),
    '吉': (20, 40, 60, 80, 100),
    '末吉': (20, 50, 70, 90, 100),
    '凶': (20, 60, 80, 90, 100),
}


def prob_choice(items, weights):
    total = weights[-1]
    hi = len(items) - 1
    return items[bisect(weights, random.random() * total, 0, hi)]


def main():
    # くじを引く
    result = prob_choice(lots, weights)

    # くじの出力
    print(result)

    # 運勢ごとに抽選
    for fortune in fortunes:
        print(f'{fortune}: {"☆" * prob_choice((1, 2, 3, 4, 5), fortune_weights[result])}')


if __name__ == '__main__':
    main()

実行結果

中吉
恋愛: ☆☆☆☆☆
仕事: ☆☆
健康: ☆☆☆☆

くじだけじゃなく個々の運勢も表示することでだいぶおみくじっぽくなりましたね。確率は適当に決めたのでお好みに調整してください。

まとめ

今回は、Pythonでおみくじを実装しました。

確率を変えて要素を取得する方法はガチャなんかにも応用することができます。

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