Về cơ bản, những gì bạn yêu cầu là một trình tạo sự kiện "bán ngẫu nhiên" tạo ra các sự kiện với các thuộc tính sau:
Tỷ lệ trung bình mà tại đó mỗi sự kiện xảy ra được chỉ định trước.
Sự kiện tương tự ít có khả năng xảy ra hai lần liên tiếp hơn là ngẫu nhiên.
Các sự kiện không thể dự đoán đầy đủ.
Một cách để làm điều đó là trước tiên triển khai trình tạo sự kiện không ngẫu nhiên thỏa mãn mục tiêu 1 và 2, sau đó thêm một số tính ngẫu nhiên để đáp ứng mục tiêu 3.
Đối với trình tạo sự kiện không ngẫu nhiên, chúng ta có thể sử dụng thuật toán phối màu đơn giản . Cụ thể, đặt p 1 , p 2 , ..., p n là khả năng tương đối của các sự kiện từ 1 đến n và đặt s = p 1 + p 2 + ... + p n là tổng các trọng số. Sau đó, chúng ta có thể tạo ra một chuỗi các sự kiện được phân bổ tối đa không ngẫu nhiên bằng thuật toán sau:
Ban đầu, cho e 1 = e 2 = ... = e n = 0.
Để tạo sự kiện, hãy tăng từng e i theo p i và xuất ra sự kiện k mà e k là lớn nhất (phá vỡ mọi mối quan hệ theo bất kỳ cách nào bạn muốn).
Giảm e k theo s và lặp lại từ bước 2.
Ví dụ, với ba sự kiện A, B và C, với p A = 5, p B = 4 và p C = 1, thuật toán này tạo ra một cái gì đó giống như chuỗi đầu ra sau:
A B A B C A B A B A A B A B C A B A B A A B A B C A B A B A
Lưu ý cách chuỗi 30 sự kiện này chứa chính xác 15 As, 12 Bs và 3 Cs. Nó không hoàn toàn phân phối tối ưu - có một vài lần xuất hiện hai liên tiếp, điều này có thể tránh được - nhưng nó đã kết thúc.
Bây giờ, để thêm tính ngẫu nhiên cho chuỗi này, bạn có một số tùy chọn (không nhất thiết phải loại trừ lẫn nhau):
Bạn có thể làm theo lời khuyên của Philipp và duy trì một "sàn" N sự kiện sắp tới, cho một số N có kích thước phù hợp . Mỗi khi bạn cần tạo một sự kiện, bạn chọn một sự kiện ngẫu nhiên từ bộ bài, và sau đó thay thế nó bằng đầu ra sự kiện tiếp theo bằng thuật toán phối màu ở trên.
Áp dụng điều này cho ví dụ trên, với N = 3, tạo ra:
A B A B C A B B A B A B C A A A A B B A B A C A B A B A B A
trong khi N = 10 mang lại kết quả tìm kiếm ngẫu nhiên hơn:
A A B A C A A B B B A A A A A A C B A B A A B A C A C B B B
Lưu ý cách các sự kiện phổ biến A và B kết thúc với nhiều lần chạy hơn do sự xáo trộn, trong khi các sự kiện C hiếm gặp vẫn diễn ra khá tốt.
Bạn có thể tiêm một số ngẫu nhiên trực tiếp vào thuật toán phối màu. Ví dụ: thay vì tăng e i theo p i trong bước 2, bạn có thể tăng nó theo p i × ngẫu nhiên (0, 2), trong đó ngẫu nhiên ( a , b ) là một số ngẫu nhiên phân bố đồng đều giữa a và b ; điều này sẽ mang lại sản lượng như sau:
A B B C A B A A B A A B A B A A B A A A B C A B A B A C A B
hoặc bạn có thể tăng e i theo p i + ngẫu nhiên (- c , c ), sẽ tạo ra (cho c = 0,1 × s ):
B A A B C A B A B A B A B A C A B A B A B A A B C A B A B A
hoặc, với c = 0,5 × s :
B A B A B A C A B A B A A C B C A A B C B A B B A B A B C A
Lưu ý cách sơ đồ cộng gộp có hiệu ứng ngẫu nhiên hóa mạnh hơn nhiều đối với các sự kiện hiếm gặp C so với các sự kiện phổ biến A và B, so với phép nhân; điều này có thể hoặc không thể được mong muốn. Tất nhiên, bạn cũng có thể sử dụng một số kết hợp của các sơ đồ này hoặc bất kỳ điều chỉnh nào khác đối với số gia, miễn là nó bảo toàn thuộc tính rằng mức tăng trung bình của e i bằng p i .
Ngoài ra, bạn có thể làm nhiễu đầu ra của thuật toán phối màu bằng cách đôi khi thay thế sự kiện k đã chọn bằng một sự kiện ngẫu nhiên (được chọn theo trọng số thô p i ). Miễn là bạn cũng sử dụng cùng một k trong bước 3 như bạn xuất ra ở bước 2, quá trình phối màu sẽ vẫn có xu hướng thậm chí biến động ngẫu nhiên.
Ví dụ: đây là một số ví dụ đầu ra, với 10% cơ hội cho mỗi sự kiện được chọn ngẫu nhiên:
B A C A B A B A C B A A B B A B A B A B C B A B A B C A B A
và đây là một ví dụ với 50% cơ hội của mỗi đầu ra là ngẫu nhiên:
C B A B A C A B B B A A B A A A A A B B A C C A B B A B B C
Bạn cũng có thể xem xét cho ăn một kết hợp của các sự kiện hoàn toàn ngẫu nhiên và dithered thành một boong / trộn hồ, như mô tả ở trên, hoặc có lẽ ngẫu nhiên các thuật toán dithering bằng cách chọn k ngẫu nhiên, như cân nặng của e i s (điều trị khối lượng tiêu cực như zero).
Thi thiên Dưới đây là một số chuỗi sự kiện hoàn toàn ngẫu nhiên, với cùng tỷ lệ trung bình, để so sánh:
A C A A C A B B A A A A B B C B A B B A B A B A A A A A A A
B C B A B C B A A B C A B A B C B A B A A A A B B B B B B B
C A A B A A B B C B B B A B A B A A B A A B A B A C A A B A
Tiếp tuyến: Vì đã có một số tranh luận trong các ý kiến về việc có cần thiết hay không, đối với các giải pháp dựa trên boong, để cho phép boong trống trước khi nó được nạp lại, tôi quyết định so sánh đồ họa của một số chiến lược lấp đầy boong:
Cốt truyện của một số chiến lược để tạo ra các đồng xu bán ngẫu nhiên (với tỷ lệ trung bình là 50:50 trên đầu). Trục hoành là số lần lật, trục dọc là khoảng cách tích lũy so với tỷ lệ dự kiến, được đo bằng (đầu - đuôi) / 2 = đầu - lật / 2.
Các đường màu đỏ và màu xanh lá cây trên cốt truyện hiển thị hai thuật toán không dựa trên boong để so sánh:
- Đường màu đỏ, phối màu xác định : kết quả số chẵn luôn luôn đứng đầu, kết quả số lẻ luôn luôn là đuôi.
- Dòng màu xanh lá cây, lật ngẫu nhiên độc lập : mỗi kết quả được chọn độc lập ngẫu nhiên, với 50% cơ hội đầu và 50% cơ hội đuôi.
Ba dòng khác (xanh lam, tím và lục lam) hiển thị kết quả của ba chiến lược dựa trên cỗ bài, mỗi chiến lược được thực hiện bằng một cỗ bài gồm 40 lá bài, ban đầu chứa 20 thẻ "đầu" và 20 thẻ "đuôi":
- Dòng màu xanh lam, điền vào khi trống : Thẻ được rút ngẫu nhiên cho đến khi bộ bài trống, sau đó bộ bài được nạp lại với 20 thẻ "đầu" và 20 thẻ "đuôi".
- Dòng màu tím, điền vào khi trống một nửa : Thẻ được rút ngẫu nhiên cho đến khi bộ bài còn lại 20 thẻ; sau đó bộ bài được xếp lên trên với 10 thẻ "đầu" và 10 thẻ "đuôi".
- Dòng Cyan, điền liên tục : Thẻ được rút ngẫu nhiên; rút thăm được đánh số chẵn được thay thế ngay lập tức bằng thẻ "đứng đầu" và rút số lẻ bằng thẻ "đuôi".
Tất nhiên, cốt truyện ở trên chỉ là một nhận thức duy nhất về một quá trình ngẫu nhiên, nhưng nó mang tính đại diện hợp lý. Cụ thể, bạn có thể thấy rằng tất cả các quy trình dựa trên boong có độ lệch giới hạn và nằm khá gần với đường màu đỏ (xác định), trong khi đường màu xanh lá cây hoàn toàn ngẫu nhiên cuối cùng lại đi lang thang.
(Trên thực tế, độ lệch của các đường màu xanh lam, tím và lục lam so với 0 bị giới hạn bởi kích thước boong: đường màu xanh không bao giờ có thể trôi xa hơn 10 bước so với 0, đường màu tím chỉ có thể cách xa 0 bước và dòng màu lục lam có thể trôi xa nhất là 20 bước so với số 0. Tất nhiên, trong thực tế, bất kỳ dòng nào thực sự đạt đến giới hạn của nó là rất khó xảy ra, vì có xu hướng mạnh mẽ để chúng trở về gần hơn nếu chúng đi lang thang quá xa tắt.)
Nhìn thoáng qua, không có sự khác biệt rõ ràng giữa các chiến lược dựa trên boong khác nhau (mặc dù, trung bình, đường màu xanh nằm gần đường màu đỏ hơn và đường màu lục lam ở xa hơn một chút), nhưng kiểm tra kỹ hơn đường màu xanh không tiết lộ một mô hình xác định riêng biệt: cứ sau 40 lần vẽ (được đánh dấu bằng các đường thẳng đứng màu xám chấm), đường màu xanh chính xác đáp ứng đường màu đỏ ở mức 0. Các đường màu tím và lục lam không bị hạn chế nghiêm ngặt và có thể tránh xa số 0 tại bất kỳ điểm nào.
Đối với tất cả các chiến lược dựa trên bộ bài, tính năng quan trọng giúp duy trì sự thay đổi của chúng là thực tế là, trong khi các thẻ được rút ngẫu nhiên từ bộ bài, bộ bài được nạp lại một cách xác định. Nếu các thẻ được sử dụng để nạp lại bộ bài được chọn ngẫu nhiên, tất cả các chiến lược dựa trên bộ bài sẽ trở nên không thể phân biệt với lựa chọn ngẫu nhiên thuần túy (đường màu xanh lá cây).