Tôi thực sự đã viết một số mã để làm điều này . Ý chính của nó là sử dụng số liệu thống kê để sửa các vệt không may mắn. Cách bạn có thể làm là theo dõi số lần sự kiện đã xảy ra và sử dụng điều đó để thiên vị số do PRNG tạo ra.
Thứ nhất, làm thế nào để chúng tôi theo dõi tỷ lệ phần trăm của các sự kiện? Cách làm ngây thơ này sẽ là giữ cho tất cả các số được tạo ra trong bộ nhớ và lấy trung bình chúng ra: chúng sẽ hoạt động nhưng không hiệu quả khủng khiếp. Sau một chút suy nghĩ, tôi đã đưa ra những điều sau đây (về cơ bản là trung bình di chuyển tích lũy ).
Lấy các mẫu PRNG sau (trong đó chúng tôi chọn nếu mẫu> = 0,5):
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
Lưu ý rằng mỗi giá trị đóng góp vào 1/5 kết quả cuối cùng. Hãy nhìn nó theo một cách khác:
Values: 0.1, 0.5
Events: 0 , 1
Lưu ý rằng 0
đóng góp tới 50% giá trị và 1
đóng góp 50% giá trị. Đưa thêm một chút:
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
Bây giờ các giá trị đầu tiên đóng góp 66% giá trị và 33% cuối cùng. Về cơ bản chúng ta có thể chắt lọc điều này theo quy trình sau:
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
Bây giờ chúng ta cần thiên vị kết quả của giá trị được lấy mẫu từ PRNG, bởi vì chúng ta sẽ có cơ hội tỷ lệ phần trăm ở đây mọi thứ dễ dàng hơn nhiều (so với, giả sử, lượng thiệt hại ngẫu nhiên trong RTS). Điều này sẽ khó giải thích vì nó 'chỉ xảy ra với tôi'. Nếu mức trung bình thấp hơn có nghĩa là chúng ta cần tăng cơ hội xảy ra sự kiện và ngược lại. Vì vậy, một số ví dụ
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%
Bây giờ, điều 'xảy ra với tôi' là trong ví dụ đầu tiên, 83% chỉ là "0,5 trên 0,6" (nói cách khác là "0,5 trên 0,5 cộng với 0,1"). Trong thuật ngữ sự kiện ngẫu nhiên có nghĩa là:
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
Vì vậy, để tạo sự kiện, về cơ bản bạn sẽ sử dụng đoạn mã sau:
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
Và do đó, bạn nhận được mã mà tôi đặt trong ý chính. Tôi khá chắc chắn rằng tất cả có thể được sử dụng trong trường hợp thiệt hại ngẫu nhiên, nhưng tôi đã không dành thời gian để tìm ra điều đó.
Tuyên bố từ chối trách nhiệm: Đây là tất cả các số liệu thống kê được trồng tại nhà, tôi không có giáo dục trong lĩnh vực này. Bài kiểm tra đơn vị của tôi làm vượt qua mặc dù.