Skip to content

Instantly share code, notes, and snippets.

@tildejustin
Created August 25, 2024 02:16
Show Gist options
  • Save tildejustin/124e8bc92233b6a018c429f6e4a64eb9 to your computer and use it in GitHub Desktop.
Save tildejustin/124e8bc92233b6a018c429f6e4a64eb9 to your computer and use it in GitHub Desktop.
villager trade probability simulator for 1.3
import random
def add_item(name: str, chance: float, offers_list: list):
if random.random() < chance:
offers_list.append(name)
def get_brown_coat_trade() -> str:
new_offers = []
add_item("wheat", .9, new_offers)
add_item("wool", .5, new_offers)
add_item("chicken", .5, new_offers)
add_item("cooked fish", .4, new_offers)
add_item("bread", .9, new_offers)
add_item("melon", .3, new_offers)
add_item("apple", .3, new_offers)
add_item("cookie", .3, new_offers)
add_item("shears", .3, new_offers)
add_item("flint n' steel", .3, new_offers)
add_item("cooked chicken", .3, new_offers)
add_item("arrow", .3, new_offers)
add_item("flint", .5, new_offers)
if len(new_offers) == 0:
return "gold"
return random.choice(new_offers)
def get_cleric_trade() -> str:
new_offers = []
add_item("eye of ender", .3, new_offers)
add_item("xp bottle", .2, new_offers)
add_item("redstone", .4, new_offers)
add_item("glowstone", .3, new_offers)
for item in ["iron sword", "diamond sword", "iron chestplate", "diamond chestplate", "iron pickaxe", "diamond pickaxe"]:
add_item(item, .1, new_offers)
if len(new_offers) == 0:
return "gold"
return random.choice(new_offers)
def get_librarian_trade() -> str:
new_offers = []
add_item("paper", .8, new_offers)
add_item("book", .8, new_offers)
add_item("written book", .3, new_offers)
add_item("bookshelf", .8, new_offers)
add_item("glass block", .8, new_offers)
add_item("compass", .8, new_offers)
add_item("clock", .8, new_offers)
if len(new_offers) == 0:
return "gold"
return random.choice(new_offers)
if __name__ == "__main__":
results = {}
modifier = 20
for i in range(1 << modifier):
trade = get_brown_coat_trade()
results[trade] = 0 if (count := results.get(trade)) is None else count + 1
print("brown coat chances")
for item in results:
print(f"{item} = {int(results.get(item) / (1 << modifier) * 100)}%")
results = {}
for i in range(1 << modifier):
trade = get_librarian_trade()
results[trade] = 0 if (count := results.get(trade)) is None else count + 1
print("\nlibrarian chances")
for item in results:
print(f"{item} = {int(results.get(item) / (1 << modifier) * 100)}%")
results = {}
for i in range(1 << modifier):
trade = get_cleric_trade()
results[trade] = 0 if (count := results.get(trade)) is None else count + 1
print("\ncleric chances")
for item in results:
print(f"{item} = {int(results.get(item) / (1 << modifier) * 100)}%")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment