นี่เป็นเรื่องราวเกี่ยวกับการเขียนโค้ด การจัดทำงบประมาณ ความขัดแย้งทางการเงิน และ D&D

การแนะนำ

สวัสดี!

ฉันเป็นนักพัฒนาเว็บไซต์อิสระ ค่อนข้างใหม่กับเกม

แม้ว่าเช่นเดียวกับคนส่วนใหญ่ ฉันเป็นและเคยเป็นมาหลายอย่าง เช่น พ่อค้าชีส นักดนตรีท่องเที่ยว ครูโรงเรียนมัธยมปลาย รวมถึงฉันแน่ใจว่าสิ่งต่าง ๆ ที่ไม่เกี่ยวข้องกับการกำหนดนิยามตนเองโดยการทำงานและ ศักยภาพในการทำเงิน

ฉันค่อนข้างมั่นใจ

สิ่งที่สำคัญที่สุดสำหรับจุดประสงค์ของเรื่องนี้: ฉันคือหมอ พ่อมดโนมมิชที่มีเรื่องราวเบื้องหลังที่ละเอียดกว่าที่ฉันอยากจะยอมรับโดยทั่วไป

ทุกเย็นวันพฤหัสบดี ฉันจะและลูกพี่ลูกน้องสองสามคนรวมตัวกันที่ Discord และดำเนินแคมเปญ D&D 5e ของเราต่อไป ปาร์ตี้ของเราประกอบด้วย: กวี Half-Elf, พระภิกษุโจรสลัด, Dwarven Rogue, Paladin ที่เกิดในมังกร และแน่นอนว่าฉันเองด้วย

ดันเจี้ยนและคำอธิบาย

หากคุณรู้จัก D&D คุณจะรู้และขออวยพรให้คุณ คุณจะปฏิบัติตาม คนอื่นๆ ฉันขอโทษ แต่ฉันแน่ใจว่าคุณเข้าใจพื้นฐานแล้ว หากคุณเคยเล่น Skyrim หรือดู Lord of the Rings คุณจะมีความรู้พื้นฐาน วงดนตรีพื้นบ้านในยุคกลางที่ใช้พลังมหัศจรรย์เพื่อพิชิตความชั่วร้าย สิ่งพื้นฐาน

กลุ่มของเราบังเอิญเป็นเจ้าของโรงเตี๊ยมในเมือง Waterdeep กลไกของเกมอนุญาตให้ผู้เล่นที่เป็นเจ้าของโรงเตี๊ยมสามารถเปิดโรงเตี๊ยมนั้นเองได้ ขายเบียร์และเหล้า ขนมหวาน และของมีค่า เช่นเดียวกับในโลกแห่งความเป็นจริง สิ่งนี้ต้องการคนงาน และคนงานเหล่านั้นต้องการค่าจ้างและวัสดุสำหรับการบริการ ดังนั้น ทุกๆ 10 วันต่อสัปดาห์ โรงเตี๊ยมจะบริหารสถานประกอบการด้วยค่าใช้จ่ายในการดำเนินงาน และนำเสนอผลกำไรให้กับผู้เล่นโดยอิงจากการทอยลูกเต๋าหลายลูก ผู้เล่นได้รับอนุญาตให้เพิ่มทองคำจำนวนเท่าใดก็ได้ลงใน งบประมาณการตลาด ซึ่งจะเปลี่ยนสูตรการทำกำไรในที่สุด

ปัญหา

หลังจากผ่านไปสองสัปดาห์ ฉันสังเกตเห็นว่ากลุ่มของฉันได้ข้อสรุปที่ไม่สมเหตุสมผลเกินไปเกี่ยวกับงบประมาณการตลาด:เพิ่มทองลงในการตลาดมากขึ้น === ได้รับทองมากขึ้นหลังจากผ่านไปหนึ่งสัปดาห์ ท้ายที่สุด ERGO การเพิ่ม ทองคำมากที่สุด ให้กับการตลาดจะนำไปสู่กำไร ทองคำมากที่สุด!

ในตอนแรกฉันไม่สนใจมากพอที่จะพยายามโน้มน้าวพวกเขาเป็นอย่างอื่น หากพวกเขาต้องการเสีย 15–20gp ต่อสัปดาห์ นั่นเป็นสิทธิพิเศษของพวกเขา แต่ฉันเป็นพ่อมด ให้ตายเถอะ การเรียนรู้คาถาไม่ได้มีราคาถูก ฉันค่อยๆ เก็บเงินเพื่อซื้อหม้อต้ม ไข่มุก ขนนกฮูก และเศษแก้ว ให้ตายเถอะ แม้แต่การจารึกคาถาเองก็บังคับให้ฉันไอมากถึง 50gp ต่อคาถา ทองคำเป็นทรัพยากรอันล้ำค่าสำหรับพ่อมด ดังนั้นฉันจึงปล่อยให้พวกเขาใช้จ่ายเงินอย่างเงียบ ๆ โดยเก็บความคิดเห็นของฉัน (และทองคำส่วนใหญ่ของฉัน) ไว้กับตัวฉันเอง

จากนั้นพวกเขาก็เริ่มประณามความตระหนี่ของฉัน

เอาล่ะ เราอยู่นี่แล้ว: กลุ่มเนิร์ดของชาวอเมริกันเชื้อสายยิว ในอินเตอร์เน็ต. โดยมีความคิดเห็นที่แตกต่างกันเกี่ยวกับการตัดสินใจทางการเงิน ในโลกสมมติที่ไม่มีผลกระทบในโลกแห่งความเป็นจริง

แน่นอนว่าสิ่งที่ตามมาคือความรู้สึกผิดของครอบครัวที่ร้อนแรงและเป็นมิตร ซึ่งทำให้ฉันรู้สึกอับอายที่ต้องยอมรับทางเลือกทางการเงินที่เลวร้ายของพวกเขา ฉันพยายามอธิบายอย่างใจเย็นว่าทำไมฉันถึงรู้สึกว่าเหตุผลของพวกเขามีพื้นฐานอยู่บนสมมติฐานที่ค่อนข้างสั่นคลอน แต่...

เห็นได้ชัดว่าพวกเขาจะไม่ฟังอย่างรวดเร็ว

ดังนั้น เช่นเดียวกับพ่อมดจอมซนผู้ขยันขันแข็ง ฉันถอนหายใจอย่างหงุดหงิดและเตรียมพร้อมที่จะใช้หมวก Mสติก A T < แข็งแกร่ง>Hอย่างเต็มกำลัง Sทำให้จักรวาลสับสนเพื่อแสดงให้พวกเขาเห็นถึงความไม่รู้ในวิถีทางของพวกเขา

การเขียนคำผิด

ในขณะที่ปาร์ตี้ของฉันดำเนินต่อไปผ่านท่อระบายน้ำเพื่อค้นหาเบาะแสสำหรับแผนการล่าสุดของหมอผีที่อยู่ติดกับเมือง ฉันก็เปิด VS Code ขึ้น และตั้งค่าสถานะทางจิตของฉันเป็น AFK อย่างมีประสิทธิภาพเท่าที่ภารกิจเกี่ยวข้อง และเริ่มด้วยการทอยลูกเต๋า .

เพื่อกำหนดรายได้สุทธิ 10 วันของเรา ฉันจำเป็นต้องทอยลูกเต๋าจำนวนหนึ่ง ตอนแรกฉันได้กำหนดตายแต่ละอันไว้ล่วงหน้า ฉันรู้หลังจากนั้นว่าหากไม่มีการใช้ซ้ำมากนัก การสร้างฟังก์ชันที่จำลองการม้วนตามจำนวนด้านที่เพียงพอ

ขั้นตอนต่อไปคือการอ่านคู่มือผู้เล่นเพื่อรับสูตรที่ฉันต้องการ: (1) ค่าแบบสุ่ม (2) รายได้รวมที่มูลค่าสามารถนำไปสู่ได้ และ (3) รายได้สุทธิตามงบประมาณการตลาด ค่านั้นหาได้ง่ายพอ: ทอย 100 ด้าน เพิ่ม 10 แล้วเพิ่มงบประมาณการตลาด การรับรายได้รวมแม้ว่าจะเกี่ยวข้องกับการกำหนดสถานการณ์ที่เป็นไปได้ของมูลค่านั้น

รายได้รวมจะถูกกำหนดโดยการม้วนมูลค่านั้น: เมื่อค่าน้อยกว่า 21 ผลตอบแทนจะเป็น -90gp; เมื่อค่าอยู่ระหว่าง 21 ถึง 30 ผลลัพธ์ที่ได้คือ -60gp เป็นต้น เนื่องจากฉันไม่ชอบเห็น (scenario > 20 && scenario < 31) มากมาย ฉันจึงย่อให้สั้นลงเล็กน้อย ฉันใช้ค่า ( เช่น 20) ลบ 1 เพื่อจัดการกับข้อเท็จจริงที่น่ารำคาญที่ว่าสถานการณ์ต่างๆ ไม่ได้รับการจัดทำดัชนีเป็นศูนย์ถึงหลักสิบ ( เช่น 20 - 1 = 19 ) คูณด้วย 0.1 ( เช่น 19 * 0.1 = 1.9) และตัดทอนเพื่อแยกค่าหลักสิบที่ต้องการ ( เช่น 1.9 ตัดทอนเป็น 1 ดังนั้นสถานการณ์คือ 1 ซึ่งน้อยกว่า 2 ซึ่งส่งคืน -90)

ด้วยเหตุนี้ ฉันสามารถหาค่าสิ้นสุดโดยใช้ตัวดำเนินการเชิงตรรกะน้อยลง เป็นการตัดสินใจที่สวยงามอย่างแท้จริง

ด้วยรายได้รวม ฉันสามารถหารายได้สุทธิได้อย่างง่ายดายโดยการลบรายจ่ายใดๆ ก็ตามที่ใช้เป็นงบประมาณการตลาด

เมื่อกำหนดฟังก์ชันตัวช่วยทั้งหมดของฉันแล้ว ก็ถึงเวลาโจมตีปัญหาโดยตรง

Laissez les Bons Dés Rouler!

ฉันต้องการตัวอย่างขนาดใหญ่เพื่อให้ได้ผลลัพธ์ที่แม่นยำ ดังนั้นฉันจึงตัดสินใจดำเนินการทดลองนับล้านครั้งต่อสถานการณ์งบประมาณ

ฉันเริ่มต้นด้วยการสร้างอาร์เรย์ที่มีความยาว 91 โดยคิดว่านี่เป็นวิธีที่รวดเร็วในการแสดงงบประมาณการตลาด เริ่มต้นที่จุดเริ่มต้นของอาร์เรย์ แต่ละดัชนีสามารถแสดงถึงงบประมาณการตลาด เช่น arr[0] จะเป็นสถานการณ์ที่งบประมาณการตลาดเป็น 0, arr[1] มีงบประมาณการตลาดเท่ากับ 1 … ไปจนถึงงบประมาณ 90gp สำหรับ arr[90] แต่ละดัชนีจะมีผลรวมของการทดลองแต่ละครั้งรวมกันสำหรับการทดลองแต่ละครั้งในล้านครั้ง

ต่อไป ฉันตั้งค่า for-loop เพื่อให้ทำงานเป็นล้านรอบ ในแต่ละรอบ ฉันทำซ้ำการทดลองต่างๆ สำหรับการทดลองใช้แต่ละครั้ง ฉันได้รับรายได้สุทธิสำหรับงบประมาณนั้นและเพิ่มไปยังการทดลองใช้

ตามหมายเหตุด้านข้าง ความซับซ้อนของเวลาดูเหมือนจะเป็น O(n1 * n2) โดยที่ n1 คือความยาว sample_size และ n2 คือ trial_sums ความยาว. ในตอนท้าย ฉันเชื่อว่านี่คือความซับซ้อนของเวลาที่มีประสิทธิผลของอัลกอริทึมนี้ เนื่องจากปัจจัยสำคัญอื่นๆ เพียงอย่างเดียวคือการวนซ้ำที่เพิ่มเข้าไปเพียงครั้งเดียวของ n2 ซึ่งจะหมายถึงความซับซ้อนของเวลาเป็น O((n1 * n2) + n2). จากความเข้าใจของฉัน เมื่อความยาว sample_size (n1) เข้าใกล้อนันต์ การเพิ่ม n2 ลูปอีกหนึ่งวงจะจางลงอย่างมีนัยสำคัญเป็น (n1 * n2)จึงถูกละเลย

การหาค่าสูงสุด

ส่วนสุดท้ายของอัลกอริธึมคือนำการทดลองสรุปเหล่านั้นมาหาค่าเฉลี่ยโดยการหารผลรวมด้วยขนาดตัวอย่างการทดลองนับล้านครั้ง สุดท้ายนี้ เพื่อความสะดวก ฉันจึงกำหนดค่าเฉลี่ยให้เป็นทศนิยมสองตำแหน่ง และตรวจสอบกับผลตอบแทนจากการลงทุนสูงสุดในปัจจุบัน max_roi หากมากกว่าค่าสูงสุดปัจจุบัน ก็... จะถูกแทนที่และดัชนีจะบันทึกเป็นงบประมาณ

บทสรุป

หลังจากทดลองใช้งานมากกว่าล้านครั้ง ฉันพบงบประมาณการตลาดที่เหมาะสมที่สุด ด้วยผลตอบแทนสุทธิเฉลี่ยที่ ~19.2gp การลงทุนรวม 30gp ทุกรอบรายสัปดาห์จึงดีที่สุด เมื่อเทียบกับ 20gp ที่มหาศาลต่อสมาชิก 6gp ต่อสมาชิกจะนำไปสู่ผลตอบแทนที่มากขึ้น

ฉันรอจนกระทั่งสิ้นสุดเซสชั่นของเรา (ฉันไม่ใช่คนเสื่อมทรามทางสังคมโดยสมบูรณ์: ฉันจะไม่ขัดจังหวะการแสดงบทบาทสมมติของใครก็ตาม) และแบ่งปันผลลัพธ์ของฉันอย่างภาคภูมิใจ ทำให้พวกเขาเห็นตรรกะที่โง่เขลาของพวกเขา ซึ่งนำไปสู่กำไรสุทธิเฉลี่ยที่ 5.62 gp เมื่อเทียบกับความไม่มีข้อผิดพลาดของฉัน

พวกเขา... ไม่รู้สึกขอบคุณเท่าที่ฉันคิดไว้

ปรากฎว่าฉันอาจจะทนไม่ไหว

Github Gist สำหรับรหัสเต็ม

เผยแพร่ครั้งแรกที่ https://sisypheaninsights.com เมื่อวันที่ 8 มกราคม 2023