Có hai loại giải pháp cho loại vấn đề này mà tôi biết: xổ số thiên vị và các chuỗi ngẫu nhiên được lọc / tạo .
Trước tiên, hãy phân phối với các giải pháp dễ dàng nhưng sai lầm mà không có trạng thái. Bất kỳ giải pháp kiểu xổ số nào không duy trì trạng thái sẽ có số lần thắng trong phân phối nhị thức, không đạt tiêu chí "nhiều lần". Bạn có thể chọn một chuỗi ngẫu nhiên chọn tất cả mọi người như nhau (chỉ cần đi xung quanh danh sách đó; hoán vị cung cấp tính ngẫu nhiên), nhưng một khi mọi người bắt đầu đi nghỉ thì trình tự của bạn bây giờ có lỗ hổng. Trừ khi bạn theo dõi, một lần nữa bạn sẽ thấy mình với các phân phối nhị thức thay vì duy trì nỗ lực như nhau.
Chúng ta cũng cam kết có sự ngẫu nhiên thực tế. Bạn có thể muốn điều này, ví dụ, một người không thể lên lịch cho kỳ nghỉ của họ trên cơ sở thuật toán xác định để họ không bao giờ có mặt khi đến lượt mua bánh sừng bò (cho đến khi họ sử dụng hết ngày nghỉ, tôi cho rằng) .
Vì vậy, về hai loại giải pháp.
Để xây dựng một xổ số thiên vị, đầu tiên lưu ý rằng chúng ta có thể chọn từ bất kỳ phân phối liên tục nào (với độ lệch hữu hạn) để tạo số cho xổ số của chúng tôi. Người thua cuộc sau đó có thể là người có số thấp nhất. Sau đó, xu hướng đơn giản nhất là theo dõi xem mỗi cá nhân đã mua nhiều hơn hoặc ít hơn so với chia sẻ của họ. Bạn có thể đo độ lệch theo đơn vị croissant. Bạn có thể điều chỉnh mức độ ngẫu nhiên bằng cách thay đổi độ rộng và hình dạng của phân phối - điều này cũng sẽ xác định khoảng cách mà bất kỳ cá nhân nào có thể nhận được từ "cùng một số lần". Gaussian là dễ dàng; chúng cho phép bất ngờ hợp lý mà không có đuôi quá dài ("không công bằng"). Vì vậy, hình dạng cơ bản của giải pháp là (theo mã Scala)
case class Employee(var bias: Double) {
def eat { bias -= 1 }
def buy(n: Int) { bias += n }
def roll = bias + stdev * Random.nextGaussian
}
Bạn có thể theo dõi những người đã mua lần cuối và cho họ một phần thưởng thiên vị khổng lồ (ví dụ 10*stdev
) để ngăn mọi người mua hai lần liên tiếp trong trường hợp cạnh trong đó cấu trúc kỳ nghỉ cho phép mọi người đã mua "lần cuối". (tức là bạn mua, sau đó đi nghỉ.) Điều tương tự cho việc không có mặt vào ngày họ được chọn. (Nếu ai đó vắng mặt mỗi ngày, cuối cùng họ sẽ xuất hiện khi họ đốt cháy phần thưởng thiên vị của họ; tôi coi đây là một tính năng chứ không phải là một lỗi.)
Vì vậy, bạn thu thập danh sách các nhân viên hiện tại của bạn trong ngày, để tất cả họ tham gia xổ số, chọn mức thấp nhất và cập nhật. Bạn có thể chọn có tiền thưởng mua bằng số lượng nhân viên (tốt khi chi phí không đáng kể nhưng chuyến đi để nhận bánh sừng bò là gánh nặng), số lượng nhân viên có mặt (tốt nếu chuyến đi dễ dàng nhưng chi phí là gánh nặng ), hoặc một cái gì đó ở giữa (để thừa nhận cả hai gánh nặng). Có lẽ tốt hơn là chỉ có hình phạt "ăn" cho những người có mặt, nhưng bạn có thể làm theo cách đó nếu bạn cảm thấy rằng chỉ đơn giản là trong kỳ nghỉ không cung cấp cho bạn một mức độ phù hợp trong ít hơn.
Để xây dựng một chuỗi ngẫu nhiên được lọc, trước tiên bạn cần tạo một chuỗi ngẫu nhiên. Xáo trộn một danh sách các nhân viên là một cách tốt như bất kỳ để bắt đầu. Chỉ cần đi qua danh sách, theo thứ tự, từ ngày này sang ngày khác. Nếu ai đó không thể mua vì họ vắng mặt hoặc không thể được nói hoặc mua trước đó, hãy bỏ qua họ. Bây giờ bạn có một vấn đề: bạn đang tích lũy những người đã bị bỏ qua. Mặc dù vậy cũng không sao. Khi bạn kết thúc chuỗi của mình, hãy thêm danh sách các nhân viên bị bỏ qua vào danh sách đầy đủ trước khi xáo trộn. Bây giờ xác suất xuất hiện tỷ lệ thuận với số lần bạn bị bỏ qua, duy trì thuộc tính "cùng số lần".
đăng nhập2( N)NN!NNđăng nhập2[ ( N!NN)1 / N] ≈- 1đăng nhập( 2 )+ nhật ký22 π/ N√N≈ - 1,4NN= 10 1,14
Cá nhân tôi ủng hộ giải pháp xổ số thiên vị vì sự kiểm soát ngẫu nhiên là tốt hơn. Với các chuỗi được lọc, bạn có thể đưa ra các cách phức tạp hơn để tạo các chuỗi. Ví dụ, thay vì hoán vị ngẫu nhiên, thực hiện hoán đổi cục bộ đến một khoảng cách nhất định hoặc cho phép hoán đổi hoàn toàn mọi người ra khỏi hồ bơi (nhưng họ đi vào danh sách bị bỏ qua) nhưng những điều này đòi hỏi nhiều nỗ lực thuật toán hơn. Với xổ số, bạn chỉ cần điều chỉnh độ lệch chuẩn.