Gacha écrit en Python -BOX Gacha-

Contenu

Créons un BOX gacha. Les sources suivantes seront utilisées. (Gacha écrit en Python-Data design-)

Qu'est-ce que BOX Gacha?

Il y a un nombre fixe de billets de loterie dans la boîte de loterie (BOÎTE), et le gacha se termine lorsque ** tous sont tirés **. (Veuillez noter que le BOX gacha qui reconstitue automatiquement la loterie de la rareté inférieure est un faux. Il brûlera gros)

Probabilité de BOX gacha

Il n'y a pas de poids pour chaque article de la loterie. La probabilité de dessiner un élément est basée sur le nombre total de feuilles (n) dans la BOÎTE.

  p = \frac{1}{n}

La probabilité après en avoir tiré un est la suivante

  p = \frac{1}{n-1}

Implémentation de BOX gacha

gacha_box.py


import random

#Utilisez une fermeture pour conserver l'état BOX
def gacha_box(gacha_items: dict):
    #Extraire l'ID
    #le poids n'est pas utilisé
    items = [key for key in gacha_items.keys()]

    def lottery(times: int=1):
        #Si le nombre de loteries est supérieur au nombre restant, correspond au nombre restant
        if len(items) < times:
            times = len(items)
        #Loterie sans chevauchement
        ids =  random.sample(items, k=times)
        #Supprimer l'ID tiré de l'article
        for key in ids:
            items.remove(key)
        return ids

    return lottery

def gacha(gacha_items: dict, times: int=1) -> list:
    #Créez un dictionnaire des identifiants et des poids requis pour la loterie
    lots = {key: info["weight"] for key, info in gacha_items.items()}
    return random.choices(tuple(lots), weights=lots.values(), k=times)

def main():
    #Informations sur l'article Gacha
    gacha_items = {
        1: {"weight": 1, "rarity": 5, "item_name": "UR_HOGE"},
        2: {"weight": 1, "rarity": 5, "item_name": "UR_FUGA"},
        3: {"weight": 9, "rarity": 4, "item_name": "SSR_HOGE"},
        4: {"weight": 9, "rarity": 4, "item_name": "SSR_FUGA"},
        5: {"weight": 20, "rarity": 3, "item_name": "SR_HOGE"},
        6: {"weight": 20, "rarity": 3, "item_name": "SR_FUGA"},
        7: {"weight": 30, "rarity": 2, "item_name": "R_HOGE"},
        8: {"weight": 30, "rarity": 2, "item_name": "R_FUGA"},
        9: {"weight": 40, "rarity": 1, "item_name": "N_HOGE"},
        10: {"weight": 40, "rarity": 1, "item_name": "N_FUGA"}
    }

    #Nom de rareté
    rarity_names = {5: "UR", 4: "SSR", 3: "SR", 2: "R", 1: "N"}

    #Nombre de loterie
    times = 10

    #Obtenez une liste d'identifiants par loterie
    ids = gacha(gacha_items, times)

    #Sortie de résultat
    print("Gacha normal")
    for id in ids:
        print("ID:%d, %s, %s" % (id, rarity_names[gacha_items[id]["rarity"]], gacha_items[id]["item_name"]))

    print("=======")
    #Stocker la fonction de loterie dans func
    func = gacha_box(gacha_items)
    times = 3
    box_ids = func(times)
    print("BOX Gacha: 1ère fois,Nombre de paramètres de loterie:%d,Nombre de résultats de loterie:%d" %(times,len(box_ids)))
    for id in box_ids:
        print("ID:%d, %s, %s" % (id, rarity_names[gacha_items[id]["rarity"]], gacha_items[id]["item_name"]))

    times = 8
    box_ids = func(times)
    print("BOX Gacha: Deuxième fois,Nombre de paramètres de loterie:%d,Nombre de résultats de loterie:%d" %(times,len(box_ids)))
    for id in box_ids:
        print("ID:%d, %s, %s" % (id, rarity_names[gacha_items[id]["rarity"]], gacha_items[id]["item_name"]))

if __name__ == '__main__':
    main()

Résultat d'exécution

Gacha normal
ID:9, N, N_HOGE
ID:4, SSR, SSR_FUGA
ID:3, SSR, SSR_HOGE
ID:10, N, N_FUGA
ID:9, N, N_HOGE
ID:4, SSR, SSR_FUGA
ID:7, R, R_HOGE
ID:5, SR, SR_HOGE
ID:9, N, N_HOGE
ID:9, N, N_HOGE
=======
BOX Gacha: 1ère fois,Nombre de paramètres de loterie:3,Nombre de résultats de loterie:3
ID:2, UR, UR_FUGA
ID:8, R, R_FUGA
ID:4, SSR, SSR_FUGA
BOX Gacha: Deuxième fois,Nombre de paramètres de loterie:8,Nombre de résultats de loterie:7
ID:6, SR, SR_FUGA
ID:1, UR, UR_HOGE
ID:5, SR, SR_HOGE
ID:9, N, N_HOGE
ID:10, N, N_FUGA
ID:3, SSR, SSR_HOGE
ID:7, R, R_HOGE

Considération

Le résultat de l'exécution de BOX gacha est différent du gacha normal, et il n'y a pas de duplication d'ID tout au long des première et deuxième fois. En outre, la deuxième fois, le contrôle est effectué lorsque le nombre de paramètres de loterie et le nombre de résultats de loterie sont différents, et vous pouvez voir que la loterie est effectuée dans le nombre restant dans la BOÎTE. En fait, la méthode correcte est de vérifier le nombre restant dans la BOÎTE avant d'exécuter le gacha et de le contrôler afin que plus de gachas ne puissent pas être exécutés. C'est une bonne idée d'ajouter une fonction pour obtenir le nombre restant dans la BOÎTE à la valeur de retour de la fonction gacha_box.

#Utilisez une fermeture pour conserver l'état BOX
def gacha_box(gacha_items: dict):
    #Extraire l'ID
    #le poids n'est pas utilisé
    items = [key for key in gacha_items.keys()]

    def lottery(times: int=1):
        #Si le nombre de loteries est supérieur au nombre restant, correspond au nombre restant
        if len(items) < times:
            times = len(items)
        #Loterie sans chevauchement
        ids =  random.sample(items, k=times)
        #Supprimer l'ID tiré de l'article
        for key in ids:
            items.remove(key)
        return ids

    #Obtenez le nombre restant dans la BOÎTE
    def remain():
        return len(items)

    return lottery, remain
   func, remain = gacha_box(gacha_items)
   times = 10
   if remain() < times:
       print("Erreur de numéro restant de la BOÎTE")
       return False
   box_ids = func(times)

Recommended Posts

Gacha écrit en Python -BOX Gacha-
Logique gacha simple écrite en Python
Gacha écrit en python-Practice 1-
Gacha écrit en Python-Data design-
Boîte de mot de passe facile en Python
Cool Lisp écrit en Python: Hy
Programme de diagnostic de compatibilité écrit en python
Quadtree en Python --2
Python en optimisation
CURL en Python
Code de vérification de la série Fourier écrit en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Test de stress avec Locust écrit en Python
Méta-analyse en Python
Unittest en Python
Probabilité de transition de la chaîne de Markov écrite en Python
Époque en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Gacha écrit en python-Rareté confirmée avec bonus-
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Gacha écrit en python-Implémentation dans la structure de données de base-
Constante en Python
Gacha écrit en python-Practice 2 ・ Bases du step-up gacha-
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Gacha écrit en python-Practice 3 ・ Ajout de fonctions gacha step-up-
Gacha écrit en python - Ajout d'une fonction de réglage de période -
Introduction à la vérification de l'efficacité Chapitre 2 écrit en Python
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python