Як ви вже говорили, неможливо забезпечити рівномірність кожної перестановки і забезпечити рівномірність розподілу кольорів, оскільки одна з перестановок має всі червоні кольори підряд.
Дуже елегантним, але, очевидно, не очевидним методом забезпечення рівномірного розподілу кольорів є використання послідовності з низькою невідповідністю.
Припустимо, у вас кульок, пронумерованих від до , і значення насіння, .N=4001Ns
Переконайтесь, що всі кульки одного кольору є послідовно пронумерованими. Тобто у вашому випадку нехай перші 100 кульок будуть червоними, наступні 40 - жовтими, наступні 50 - зеленими тощо.
Потім кульку значення, таке, що:
деkthxk
xk=(s+kϕ)(mod1),
- ϕ=1+5√2=1.61803399... , золоте співвідношення
- оператор , який приймає дробову частину аргументу(mod1)
- s - будь-яке постійне значення насіння, яке ви бажаєте.
Тобто, кожному з балів буде виділено значення яке завжди буде від 0 до 1.Nxk
Тепер просто замовляйте кульки, у порядку зростання, відповідно до їх значення .xk
Наприклад, використовуючи значення насіння , кулі будуть впорядковані так:
s=0
{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}
(де "
B"= Синій, а" "= чорний).
K
Нарешті, якщо ви хочете взяти інший зразок, просто виберіть інше значення насіння, .s
Код Python для цього розподілу такий: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)