ฉันเขียนโค้ดเพื่อทำสิ่งนี้จริงๆ ส่วนสำคัญของมันคือการใช้สถิติเพื่อแก้ไขลายโชคร้าย วิธีที่คุณสามารถทำได้คือติดตามว่ามีเหตุการณ์เกิดขึ้นกี่ครั้งและใช้เพื่อตั้งค่าหมายเลขที่สร้างโดย PRNG
ประการแรกเราจะติดตามเปอร์เซ็นต์ของเหตุการณ์ได้อย่างไร วิธีที่ไร้เดียงสาของการทำเช่นนี้คือการเก็บตัวเลขทั้งหมดที่เคยสร้างขึ้นในความทรงจำและทำให้พวกมันเฉลี่ย: ซึ่งจะใช้งานได้ แต่ไม่มีประสิทธิภาพอย่างน่ากลัว หลังจากคิดไปเล็กน้อยฉันก็คิดเรื่องต่อไปนี้ (ซึ่งก็คือค่าเฉลี่ยเคลื่อนที่สะสม )
ใช้ตัวอย่าง PRNG ต่อไปนี้ (โดยที่เรา proc ถ้าตัวอย่างคือ> = 0.5):
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
ขอให้สังเกตว่าแต่ละค่าก่อให้เกิด 1/5 ของผลลัพธ์สุดท้าย ลองดูอีกวิธี:
Values: 0.1, 0.5
Events: 0 , 1
ขอให้สังเกตว่า0
มีส่วนร่วมถึง 50% ของมูลค่าและ1
มีส่วนช่วย 50% ของมูลค่า ถ่ายเพิ่มเติมเล็กน้อย:
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
ตอนนี้ค่าแรกมีส่วนร่วม 66% ของมูลค่าและ 33% สุดท้าย โดยทั่วไปเราสามารถแยกส่วนนี้เป็นกระบวนการต่อไปนี้:
result = // 0 or 1 depending on the result of the event that was just generated
new_samples = samples + 1
average = (average * samples / new_samples) + (result * 1 / new_samples)
// Essentially:
average = (average * samples / new_samples) + (result / new_samples)
// You might want to limit this to, say, 100.
// Leaving it to carry on increasing can lead to unfairness
// if the game draws on forever.
samples = new_samples
ตอนนี้เราต้องมีอคติผลลัพธ์ของค่าตัวอย่างจาก PRNG เพราะเรากำลังหาโอกาสแบบเปอร์เซ็นต์ที่นี่สิ่งต่างๆนั้นง่ายกว่ามาก (เทียบกับพูดความเสียหายสุ่มใน RTS) สิ่งนี้จะอธิบายได้ยากเพราะ 'เพิ่งเกิดขึ้นกับฉัน' ถ้าค่าเฉลี่ยต่ำกว่าหมายความว่าเราต้องเพิ่มโอกาสของเหตุการณ์ที่เกิดขึ้นและในทางกลับกัน ตัวอย่างบางส่วน
average = 0.1
desired = 0.5
corrected_chance = 83%
average = 0.2
desired = 0.5
corrected_chance = 71%
average = 0.5
desired = 0.5
corrected_change = 50%
ตอนนี้สิ่งที่ 'เกิดขึ้นกับฉัน' ก็คือในตัวอย่างแรก 83% เป็นเพียง "0.5 จาก 0.6" (อีกนัยหนึ่งคือ "0.5 จาก 0.5 บวก 0.1") ในแง่ของเหตุการณ์แบบสุ่มซึ่งหมายถึง:
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
ดังนั้นเพื่อสร้างเหตุการณ์คุณโดยทั่วไปจะใช้รหัสต่อไปนี้:
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
และดังนั้นคุณจะได้รับรหัสที่ฉันใส่ในส่วนสำคัญ ฉันค่อนข้างมั่นใจว่าทั้งหมดนี้สามารถใช้ในสถานการณ์กรณีความเสียหายแบบสุ่ม แต่ฉันไม่ได้ใช้เวลาในการคิดออก
คำเตือน:นี่คือสถิติที่ปลูกในบ้านทั้งหมดฉันไม่มีการศึกษาในสาขานี้ การทดสอบหน่วยของฉันผ่านการทดสอบแล้ว