Saya sebenarnya menulis beberapa kode untuk melakukan ini . Intinya adalah menggunakan statistik untuk memperbaiki coretan sial. Cara Anda dapat melakukan ini adalah untuk melacak berapa kali peristiwa telah terjadi dan menggunakannya untuk membiasakan nomor yang dihasilkan oleh PRNG.
Pertama, bagaimana kita melacak persentase acara? Cara naif melakukan ini adalah menjaga semua angka yang pernah dihasilkan dalam memori dan rata-rata keluar: yang akan bekerja tetapi sangat tidak efisien. Setelah sedikit berpikir saya datang dengan yang berikut (yang pada dasarnya adalah rata-rata bergerak kumulatif )
Ambil sampel PRNG berikut (tempat kami membeli jika sampel>> 0,5):
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
Perhatikan bahwa setiap nilai berkontribusi hingga 1/5 dari hasil akhir. Mari kita lihat dengan cara lain:
Values: 0.1, 0.5
Events: 0 , 1
Perhatikan bahwa 0
kontribusi berkontribusi 50% dari nilai dan 1
kontribusi 50% nilai. Diambil sedikit lebih jauh:
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
Sekarang nilai pertama berkontribusi 66% dari nilai dan 33% terakhir. Kami pada dasarnya dapat menyaring ini ke proses berikut:
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
Sekarang kita perlu mem-bias hasil dari nilai sampel dari PRNG, karena kita akan mencari peluang persentase di sini segalanya jauh lebih mudah (dibandingkan, katakanlah, jumlah kerusakan acak dalam RTS). Ini akan sulit untuk dijelaskan karena 'baru saja terpikir olehku'. Jika rata-rata lebih rendah itu berarti bahwa kita perlu meningkatkan peluang acara terjadi dan sebaliknya. Demikian beberapa contoh
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%
Sekarang apa yang 'terpikir oleh saya' adalah bahwa dalam contoh pertama 83% hanya "0,5 dari 0,6" (dengan kata lain "0,5 dari 0,5 ditambah 0,1"). Dalam istilah peristiwa acak yang artinya:
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
Jadi untuk menghasilkan suatu acara pada dasarnya Anda akan menggunakan kode berikut:
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
Dan karena itu Anda mendapatkan kode yang saya masukkan di intinya. Saya cukup yakin ini semua dapat digunakan dalam skenario kasus kerusakan acak, tapi saya belum meluangkan waktu untuk mencari tahu.
Penafian: Ini semua statistik buatan sendiri, saya tidak punya pendidikan di lapangan. Tes unit saya lulus.