Créons un BOX gacha. Les sources suivantes seront utilisées. (Gacha écrit en Python-Data design-)
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)
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}
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()
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
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