from lib.Natives import NativeLoader def throw_dice_cpp(n: int, sides: list, probs: list): loader = NativeLoader() dice_mod = loader.cpp("dice") Dice = dice_mod.Dice d = Dice(sides, probs) d.reset_stats() res = d.throw_dice(n) accepted, rejected = d.stats() return res, accepted, rejected dice_sides = ['1', '2', '3', '4', '5', '6'] dice_props = [0.1, 0.1, 0.1, 0.1, 0.1, 0.5] coin_sides = ['Head', 'Number'] coin_head = [0.1, 0.5] rep = 100000 # --- Dice test --- res_cpp, acc_dice, rej_dice = throw_dice_cpp(rep, dice_sides, dice_props) total = sum(res_cpp.values()) probs_estimated = {k: v / total for k, v in res_cpp.items()} print("C++ Dice result (relative):", probs_estimated) print(f"Accepted: {acc_dice/(acc_dice+rej_dice)*100:.2f}%, " f"Rejected: {rej_dice/(acc_dice+rej_dice)*100:.2f}%\n") # --- Coin test --- res_coin, acc_coin, rej_coin = throw_dice_cpp(rep, coin_sides, coin_head) total_coin = sum(res_coin.values()) probs_coin = {k: v / total_coin for k, v in res_coin.items()} print("C++ Coin result (relative):", probs_coin) print(f"Accepted: {acc_coin/(acc_coin+rej_coin)*100:.2f}%, " f"Rejected: {rej_coin/(acc_coin+rej_coin)*100:.2f}%")