ฉันเห็นด้วยกับคำตอบก่อนหน้านี้ว่าการสุ่มตัวอย่างจริง ๆ ในเกมเล็ก ๆ บางเกมไม่เป็นที่น่าพอใจ - มันดูไม่ยุติธรรมสำหรับบางกรณีการใช้งาน
ฉันเขียน Shuffle Bag อย่างง่ายเช่นการนำไปใช้ใน Ruby และทำการทดสอบบางอย่าง การใช้งานทำสิ่งนี้:
- หากดูเหมือนว่ายังยุติธรรมอยู่หรือเรายังไม่ถึงเกณฑ์ม้วนต่ำสุดก็จะส่งคืน Hit ที่ยุติธรรมตามความน่าจะเป็นปกติ
- หากความน่าจะเป็นที่สังเกตได้จากม้วนที่ผ่านมาทำให้ดูเหมือนว่าไม่ยุติธรรมจะส่งคืน "การตีที่ยุติธรรม"
มันถือว่าไม่ยุติธรรมตามความน่าจะเป็นขอบเขต ตัวอย่างเช่นสำหรับความน่าจะเป็น 20% คุณสามารถตั้งค่า 10% เป็นขอบเขตล่างและ 40% เป็นขอบเขตบน
ใช้ขอบเขตที่ผมพบว่ามีวิ่ง 10 ฮิต14.2% ของเวลาการดำเนินงานที่แท้จริง pseudorandom ผลิตผลลัพธ์ที่อยู่นอกขอบเขตเหล่านั้น ประมาณ 11% ของเวลามีการทำคะแนนวิกฤติ 0 ครั้งใน 10 ครั้ง 3.3% ของเวลา, 5 ครั้งหรือมากกว่านั้นถูกวิพากษ์วิจารณ์อย่างรุนแรงจาก 10 โดยธรรมชาติแล้วการใช้อัลกอริธึมนี้ (ด้วยจำนวนรอบการหมุนต่ำสุด 5) จำนวนน้อยกว่ามาก (0.03%) ของการวิ่งแบบ "Fairish" . แม้ว่าการใช้งานด้านล่างจะไม่เหมาะสม (สิ่งที่ฉลาดกว่าสามารถทำได้แน่นอน) ก็เป็นที่น่าสังเกตว่าผู้ใช้ของคุณมักจะรู้สึกว่ามันไม่ยุติธรรมกับโซลูชันปลอมเทียมจริง ๆ
นี่คือเนื้อของฉันFairishBag
เขียนในทับทิม การดำเนินการทั้งหมดและรวดเร็วในการจำลอง Monte Carlo สามารถใช้ได้ที่นี่ (สรุปสาระสำคัญ)
def fire!
hit = if @rolls >= @min_rolls && observed_probability > @unfair_high
false
elsif @rolls >= @min_rolls && observed_probability < @unfair_low
true
else
rand <= @probability
end
@hits += 1 if hit
@rolls += 1
return hit
end
def observed_probability
@hits.to_f / @rolls
end
อัปเดต:การใช้วิธีนี้จะเพิ่มความน่าจะเป็นโดยรวมในการได้รับการโจมตีที่สำคัญถึงประมาณ 22% โดยใช้ขอบเขตด้านบน คุณสามารถชดเชยสิ่งนี้ได้โดยตั้งค่าความน่าจะเป็น "ของจริง" ให้ต่ำลงเล็กน้อย ความน่าจะเป็นที่ 17.5% เมื่อปรับเปลี่ยนแบบ fairish ให้ผลตอบแทนความน่าจะเป็นระยะยาวที่สังเกตได้ประมาณ 20% และทำให้ระยะสั้นมีความรู้สึกยุติธรรม