Temel olarak, istediğiniz şey, aşağıdaki özelliklere sahip olaylar oluşturan "yarı rastgele" bir etkinlik oluşturucusudur:
Her olayın gerçekleştiği ortalama oran önceden belirlenir.
Aynı olayın art arda iki kez artması muhtemeldir.
Olaylar tam olarak tahmin edilebilir değildir.
Bunu yapmanın bir yolu, ilk önce 1. ve 2. hedefleri karşılayan rastgele olmayan bir olay üreteci uygulamak ve ardından 3. hedefi yerine getirmek için bazı rasgelelikler eklemektir.
Rasgele olmayan olay üreteci için basit bir titreme algoritması kullanabiliriz. Spesifik olarak, p 1 , p 2 , ..., p n , 1 ila n olaylarının nispi olasılıkları ve s = p 1 + p 2 + ... + p n ağırlıkların toplamı olsun. Daha sonra aşağıdaki algoritmayı kullanarak rastgele olmayan bir maksimum eşitlik dağıtılmış olay dizisi oluşturabiliriz:
Başlangıçta, e 1 = e 2 = ... = e n = 0 olsun.
Bir olayı oluşturmak için, her bir arttırmak e ı ile p I ve çıkış olay k olan E k (bağları istediğiniz şekilde kırma) en büyüğüdür.
Eksiltme e k ile s ve basamak 2'den elde edilen tekrar.
Örneğin, üç A, B ve C olayı göz önüne alındığında, p A = 5, p B = 4 ve p C = 1 ile, bu algoritma aşağıdaki çıktı dizisi gibi bir şey üretir:
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
Bu 30 olay dizisinin tam olarak 15 As, 12 Bs ve 3 C içerdiğine dikkat edin. O değil oldukça optimal dağıtır - önlenebilirdi olabilirdi üst üste iki As birkaç oluşumları vardır - ama yakın alır.
Şimdi, bu diziye rasgelelik eklemek için, birkaç (zorunlu olarak birbirini dışlayan değil) seçeneğiniz vardır:
Sen takip edebilirsiniz Philipp'in tavsiyesi ve bir "güverte" korumak N bazı uygun boyutta sayı için, yaklaşan etkinlikler N . Bir etkinlik oluşturmak istediğiniz her seferde, desteden rastgele bir etkinlik seçersiniz ve ardından yukarıdaki dithering algoritmasıyla bir sonraki etkinlik çıktısıyla değiştirirsiniz.
Bunu yukarıdaki örneğe N = 3 ile uygulamak, örneğin:
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
oysa , N 10 verim = daha rasgele görünümlü:
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
Yaygın A ve B olaylarının karışma nedeniyle daha çok nasıl sonuçlandığını, oysaki nadir görülen C olaylarının hala oldukça iyi aralıklarla yapıldığını unutmayın.
Bazı rasgeleliği doğrudan dithering algoritmasına enjekte edebilirsiniz. Örneğin, yerine artan bir e i ile p ı aşama 2'de, bunu aşağıdaki şekilde artırmak olabilir p ı (rastgele x rastgele (0, 2), bir , b ) bir muntazam biçimde rastgele sayı dağıtılır bir ve b ; bu, aşağıdaki gibi çıktı verir:
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
ya da olabilir artış e ı ile p i + rasgele - ( C , C (için üretecektir), c = 0.1 x 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
veya, c = 0.5 × s için :
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
Katkı şemasının, nadir olay C için, ortak olay A ve B'den ziyade, çoğaltıcı olana kıyasla daha güçlü bir randomize etkiye sahip olduğuna dikkat edin; bu arzu edilebilir veya olmayabilir. O mülkü korur olarak Tabii ki, aynı zamanda sürece, bu şemalarda veya artışlarla başka herhangi bir ayarlama bazı kombinasyonlarını kullanabilirsiniz ortalama sayısının artmaya e i eşittir P i .
Alternatif olarak, perturb olabilir çıkış bazen seçilen olay yerine Titreme algoritma k (ham ağırlıkları göre seçilen rastgele bir ile p i ). Sürece aynı kullandıkça k 2. adımda size çıktı olarak 3. adımda, titreme işlemi bile hala rasgele dalgalanmaların dışarı eğiliminde olacaktır.
Örneğin, bazı örnek çıktılar, rastgele seçilen her olayın% 10'uyla:
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
ve işte her bir çıkışın% 50 tesadüf rastgele olduğu bir örnek:
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
Yukarıda tarif edildiği gibi, aynı zamanda, bir güverte / karıştırma havuza tamamen rastgele ve titretilmiş etkinlikleri kanşımını besleme dikkate veya belki seçerek Titreme algoritması randomize olabilir k ile tartılır olarak, rastgele e ı s (sıfır negatif ağırlıkları tedavisi).
Ps. Karşılaştırma için aynı ortalama oranlara sahip bazı tamamen rastgele olay dizileri:
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
Tanjant: olmuştur yana yorumlarda bazı tartışmalar o doldurulmuş edilmeden önce güverte boşaltmak için izin vermek, güverte tabanlı çözümler için gerekli olup olmadığı hakkında, ben birkaç güverte-dolum stratejilerinin grafiksel karşılaştırma yapmaya karar:
Yarı rastgele bozuk para üretme stratejilerinin bir kısmı (ortalama olarak 50:50 kafa oranı kuyruk oranıyla). Yatay eksen, kat sayısıdır, dikey eksen, beklenen orandan kümülatif mesafedir, (kafalar - kuyruklar) / 2 = kafalar - parmaklar / 2 olarak ölçülür.
Çizimdeki kırmızı ve yeşil çizgiler karşılaştırma için iki güverte temelli olmayan algoritmalar göstermektedir:
- Kırmızı çizgi, deterministik titizlik : çift numaralı sonuçlar her zaman kafa, tek sayılı sonuçlar her zaman kuyruktur.
- Yeşil çizgi, bağımsız rasgele çevirmeler : her sonuç,% 50 kafa şansı ve% 50 kuyruk şansı ile rastgele bağımsız olarak seçilir.
Diğer üç satır (mavi, mor ve camgöbeği), her biri başlangıçta 20 adet "kafa" kartı ve 20 adet "kuyruk" kartıyla doldurulmuş 40'lık desteden oluşan üç deste tabanlı stratejinin sonuçlarını göstermektedir:
- Mavi çizgi, boşken doldurun : Deste boşalana kadar kartlar rasgele çekilir, daha sonra deste 20 "kafa" kartı ve 20 "kuyruk" kartı ile doldurulur.
- Mor çizgi, yarı boş olduğunda doldur : Kartlar destede 20 tane kalıncaya kadar rastgele çekilir; daha sonra desteye 10 adet "kafa" kartı ve 10 adet "kuyruk" kartı yerleştirilir.
- Mavi çizgi, sürekli doldurma : Kartlar rastgele çekilir; çift sayılı çekilişler hemen "kafa" kartıyla değiştirilir ve tek sayılı çekilişler "uç" kartıyla derhal değiştirilir.
Tabii ki, yukarıdaki komplo rastgele bir sürecin sadece tek bir gerçekleşmesidir, ancak makul temsilcisidir. Özellikle, tüm güverte tabanlı işlemlerin sınırlı önyargıya sahip olduğunu görebilir ve kırmızı (deterministik) çizgiye oldukça yakın kalabilirsiniz, oysa tamamen rastgele yeşil çizgi sonunda kaybolur.
(Aslında, mavi, mor ve mavi çizgilerin sıfırdan uzağa sapması kesinlikle güverte boyutuyla sınırlıdır: mavi çizgi asla sıfırdan 10 adımdan daha fazla uzaklaşamaz, mor çizgi sıfırdan sadece 15 adım alabilir ve camgöbeği çizgisi sıfıra en fazla 20 adım mesafede sürüklenebilir.Tabii ki, pratikte, sınırına ulaşan çizgilerin herhangi birinin son derece düşük olması muhtemeldir, çünkü çok fazla dolaşırlarsa sıfıra yaklaşma eğilimi güçlüdür. kapatır.)
Bir bakışta, farklı güverteye dayalı stratejiler arasında belirgin bir fark yoktur (ortalama olarak mavi çizgi kırmızı çizgiye biraz daha yakın dursa da ve mavi çizgi biraz uzağa kalsa da), ancak mavi çizginin daha yakından incelenmesi belirgin bir deterministik desen ortaya koyuyor: her 40 çizimde (noktalı gri dikey çizgilerle işaretlenmiştir), mavi çizgi tam olarak kırmızı çizgide sıfır noktasında buluşuyor. Mor ve mavi çizgiler çok sıkı bir şekilde sınırlandırılmamıştır ve herhangi bir noktada sıfırdan uzak kalabilir.
Tüm güverte tabanlı stratejiler için değişkenliklerini sınırlayan önemli özellik, kartların desteden rasgele çekilirken destenin belirleyici olarak doldurulmasıdır . Desteyi yeniden doldurmak için kullanılan kartların kendileri rastgele seçildiyse, desteye dayalı stratejilerin tümü saf rastgele seçimden (yeşil hat) ayırt edilemez hale gelirdi.