Như bạn đã nói, không thể đảm bảo rằng mọi hoán vị đều có khả năng như nhau và đảm bảo rằng các màu được phân bố đều, bởi vì một trong các hoán vị có tất cả các màu đỏ liên tiếp.
Một phương pháp rất thanh lịch, nhưng chắc chắn không rõ ràng, để đảm bảo màu sắc được phân bố đồng đều là tận dụng một chuỗi chênh lệch thấp.
Giả sử bạn có quả bóng, được đánh số từ đến và giá trị hạt giống, .N=4001Ns
Đảm bảo rằng tất cả các quả bóng cùng màu được đánh số liên tiếp. Đó là, trong trường hợp của bạn, hãy để 100 quả bóng đầu tiên có màu đỏ, 40 quả tiếp theo có màu vàng, 50 quả xanh tiếp theo, v.v.
Sau đó, phân bổ bóng giá trị, sao cho:
trong đókthxk
xk=(s+kϕ)(mod1),
- ϕ=1+5√2=1.61803399... , tỷ lệ vàng
- các điều hành mà có phần phân đoạn của các đối số(mod1)
- s là bất kỳ giá trị 'hạt giống' không đổi mà bạn muốn.
Nghĩa là, mỗi quả bóng sẽ được phân bổ một giá trị sẽ luôn nằm trong khoảng từ 0 đến 1.Nxk
Bây giờ chỉ cần sắp xếp các quả bóng, theo thứ tự tăng dần theo giá trị của chúng .xk
Ví dụ: sử dụng giá trị hạt giống của , các quả bóng sẽ được sắp xếp như sau:
s=0B K
{B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K}
(trong đó "
B"= Màu xanh và" "= Đen).
K
Cuối cùng, nếu bạn muốn lấy một mẫu khác, chỉ cần chọn một giá trị hạt giống khác, .s
Mã Python cho việc phân bổ này như sau:xk
n=400
phi = (1+pow(5,0.5))/2
x = np.zeros(n)
s = np.random.uniform(0,1)
for i in range(n):
x = (s + phi*(i+1)) %1
print (s)
print (x)