User:Prowler/Chargeable ring generation sim

From NetHackWiki
Jump to navigation Jump to search
#!/usr/bin/env python

import random

def rn2(n):
    return random.randint(0, n - 1)

def blessorcurse(chance):
    if not rn2(chance):
        return random.choice(['blessed', 'cursed'])
    return 'uncursed'

def bcsign(buc):
    return {'blessed': 1, 'uncursed': 0, 'cursed': -1}[buc]

def gen_chargeable_ring():
    buc = blessorcurse(3)
    charge_sign = 0
    if rn2(10):
        if rn2(10) and bcsign(buc):
            charge_sign = bcsign(buc)
        else:
            charge_sign = random.choice([-1, 1])
    if charge_sign == 0:
        charge = rn2(4) - rn2(3)
        if charge > 0:
            charge_sign = 1
        elif charge < 0:
            charge_sign = -1

    if charge_sign < 0 and rn2(5):
        buc = 'cursed'

    return buc, charge_sign

N = 10000000
table = {}

for i in range(N):
    key = gen_chargeable_ring()
    table.setdefault(key, 0)
    table[key] += 1

for buc in ('blessed', 'uncursed', 'cursed'):
    for charge_sign in (1, 0, -1):
        charge_sign_str = {-1: '<= -1', 0: '0', 1: '>= +1'}[charge_sign]
        print(f"{buc} {charge_sign_str}:\t{table[buc, charge_sign]/N*100:.2f}%")

Output:

blessed >= +1:	15.08%
blessed 0:	0.42%
blessed <= -1:	0.23%
uncursed >= +1:	33.32%
uncursed 0:	1.67%
uncursed <= -1:	6.34%
cursed >= +1:	1.58%
cursed 0:	0.42%
cursed <= -1:	40.94%