Zorluklarda rastgele üretimi belirtmenin yolları


16

Not : Meta üzerinde fikir birliğine göre , soruları burada konu ile ilgilidir.

Bu "zorluklar yazılırken kaçınılması gereken" ışığında, belirli türdeki nesnelerin rastgele üretilmesini içeren zorluklar hakkında düşünmeye başladım.

Bazen rastgele bir foo oluşturmayı içeren bir meydan okuma göndermek istiyorum , nerede

  1. belirli bir şeyin foo olup olmadığını kontrol etmek çok kolaydır ve
  2. hızlı bir şekilde "kaliteli" rastgele bir foo oluşturmak biraz daha zordur.

Örnek olarak, bir foo herhangi bir yönde 4 eşit bitlik segmentin bulunmadığı bir ikili matris olabilir. Belirli bir ikili matrisin bir foo olup olmadığını kontrol etmek kolaydır, ancak güzel bir yayılma dağılımına sahip rastgele bir foo oluşturmak, bir geri izleme algoritması veya benzer bir şey gerektiriyor gibi görünmektedir.

Her neyse, şimdi rastgele bir foo olarak neyin nitel olduğunu objektif olarak belirtmeliyim ve programı birkaç kez çalıştırdığımda sonuçların her zaman farklı göründüğü sezgisel anlamda "öngörülemez" olmasını istiyorum. En kısıtlayıcı yaklaşım, çıktının eşit şekilde rasgele olmasını zorunlu kılmaktır: tüm geçerli foosların üretilme olasılığı aynıdır. Bu genellikle çok kısıtlayıcıdır, çünkü tüm geçerli fooları oluşturmak, kopyaları kaldırmak ve sıkıcı ve yavaş olanı seçmek için nasıl kaydedeceğimi bilmiyorum.

Bir sonraki fikrim, tüm geçerli forumların olumlu bir oluşturulma olasılığına sahip olmasını istemektir. Bununla birlikte, bu şu yaklaşımın geçerli olduğu anlamına gelir: rastgele bir foo benzeri şey üretin (örneğimizde rastgele bir ikili matris), eğer bir foo daha sonra geri döndürün, aksi takdirde sabit kodlu bir foo döndürün (örneğin, kimlik matrisi ). Bu da biraz sıkıcı çünkü temelde rastgele bir matris jeneratörüne takılan foos tanıyıcı.

Öngörülemeyen rasgele bir foo için güzel bir genel tanım olabilir mi?

TL; DR

Dağıtımı düzeltmeyen, ancak sabit kodlamayı engelleyen "öngörülemeyen" rastgele oluşturulmuş bir nesne belirtmenin iyi bir yolu var mı?


Metada rastgele , sabit kodlamayı yasaklayacak, ancak mükemmel bir şekilde üniform olarak kısıtlamayan standart bir tanımımız var .
Geobits

5
Harika bir soru. Geçmişte rastgelelik belirtmenin zor olduğunu gördüm . Özellikle tanımladığınız senaryo için, rastgele adaylar oluşturabilmeniz ve geçersiz olmaları durumunda tekrar yapabileceğiniz bir sorun da vardır. Bu size tekdüze bir dağıtım sağlar, ancak deterministik olmayan bir çalışma zamanı sağlar. Düzgün dağılım belirtilirken, gerçek çözümlerin asla mükemmel bir şekilde tekdüze olmadığı sorunu da vardır . Bu çok ince bir konudur. +1
Martin Ender

@MartinEnder Doğru, bu yaklaşımı unuttum. Ben ve diğer yavaş algoritma zaman sınırları ile izin veremez, ama yine de "bir sabit kodlu foo" çözüm izin.
Zgarb

K3 / K4 CPRNG'yi belirtebileceğiniz gibi görünüyor, çoğu dilde bir kütüphane olacak. en.wikipedia.org/wiki/Pseudorandom_number_generator
Ewan

1
@Zgarb, "Oluştur ve yeniden yap" a izin vermemekle ilgili büyük bir sorun, dilin RNG kütüphanelerinin çoğunun bunu yapmasıdır.
Nathan Merrill

Yanıtlar:


5

Bin farklı foo getir

Bu, sabit kodlanmış değerleri döndürmeyi ve yarım iyi bir golf almayı imkansız hale getirir. Bununla birlikte, yasal bir foo jeneratörü, gerçekte onları kontrol etmedikçe, yinelenen foo çıktısı alma şansı azdır. Kontrol yükünü kaldırmak için ampirik olarak test edilmiş% 10'luk bir arıza oranı kabul edilebilir olarak belirtilebilir.

Farkında olun doğum günü paradoksu Yinelenenlerin olasılık düşündüğünüzden daha yüksek olabileceğini,. Sadece bir milyon olası foo varsa, bin rastgele foo'nun yaklaşık 0,6 olasılığı vardır, orada bir yerde bir kopya var ve bu foo üretiminin tamamen tekdüze olduğunu varsayar. Bu bir sorun olabilirse, üretilen her 1000 için 900 benzersiz foos gerektirir, bu da orijinal bir foo jeneratörü için çok daha cömerttir, ancak yine de sabit kodlama için pratik değildir.

Bu aynı zamanda foo benzeri şeyler tekrar tekrar oluşturmanıza ve foos alana kadar fooness'i kontrol etmenize izin verir. Bunun kendim için geçerli bir çözüm olduğunu düşünüyorum, ancak beğenmediyseniz:

Çabucak yap

Tamamen rastgele bir foo benzeri şeyin foo olma şansı muhtemelen oldukça düşüktür, bu nedenle bir zaman sınırının belirlenmesi, foo üretimine gerçek bir girişimi zorlayacaktır.

Farklı diller arasındaki hız farklılıklarını karşılamak için Hackerrank gibi dile bağlı olarak farklı zaman sınırlarına sahip olmak isteyebilirsiniz: https://www.hackerrank.com/environment . Ancak yeterince büyük foos belirtirseniz, rastgele foo benzeri şeylerin foo olma olasılığı gerçekten düşük olabilir, bu nedenle "Evrenin ısı ölümünden önce" kuralı yeterli olabilir.


Sanırım burada bir şey üzerinde çalışıyorsun. "Programın N kez çalıştırılması, zamanın en az% 90'ının çoğaltılmasına neden olmaz" somut ve test edilmesi oldukça kolaydır ve kaba zorlamayı ve basit ret örneklemesini önlemek için bir süre ile birleştirilebilir.
Zgarb

2

Soruna nihai çözüm bulduğumu iddia etmiyorum (veya bu listenin kapsamlı olduğunu), ancak akla gelen bazı olası yaklaşımları ve neden işe yarayıp yaramayacağını belirtmek istiyorum. Ayrıca, mevcut zaman damgasını bir rastgelelik kaynağı olarak kullanmanın yeterince "öngörülemez" olup olmadığı ve olasılık dağılımının belirli özelliklerinin nasıl uygulanacağı gibi teğetsel sorunları ele almayacağım - sadece kodlama kullanan çözümlerden kaçınmaya odaklanacağım.

Çözüm değil: açık kodlamaya açıkça izin verme

Bu kötü bir fikir. Bu, gözlemlenebilir olmayan bir gereksinimdir (yani, yalnızca programı çalıştırarak memnun olup olmadığını belirleyemezsiniz), bu da PPCG'de şiddetle tavsiye edilmez ve programı, gönderilerin bir doğrulamayla doğrulandığı başka bir platformda çalıştırılması durumunda imkansız olabilir. otomatik yöntem. Bunun gibi bir gereksinimle ilgili sorun, "sabit kodlama" için nesnel bir tanım bularak başlamak zorunda olmanızdır. Genel olarak, bunu denerseniz, sadece işleri daha da kötüleştireceksiniz.

Sabit kodlamayı olanaksız hale getirin

Tamamen izin veremezseniz, ancak insanların onu kullanmasını istemiyorsanız, zor kodlamayı sadece rekabetçi bir yaklaşım olmayacak şekilde tasarlamayı deneyebilirsiniz. Oluşturulması gereken nesneler, koda bir örnek yerleştirmenin geçerli çözümler rastgele üreten bir algoritma yazmaktan çok daha fazla bayt gerektireceği kadar büyük ve sıkıştırılamazsa bu mümkündür. Özel örneğinizde, bu elbette geçerli değildir, çünkü kimlik matrisleri geçerlidir ve genellikle üretilmesi kolaydır, ancak diğer sorunlar için durum böyle olmayabilir. Hedef nesneler yeterince düzensizse, büyük olasılıkla gerçek bir algoritmanın bayt sayısını etkilemeyecek, ancak sabit kodlu parçayı havaya uçuracak büyük boyutta olmalarını isteyin.

Çıktıyı parametreleştirin

Çoğu zaman, bu sorunlar, örneğinizdeki matrisin boyutu gibi bir veya daha fazla doğal parametreyle gelir. Eğer öyleyse, bu parametreyi bir girdi yapmak, sabit kodlamayı imkansız veya en azından pratik yapmak için yeterli olabilir. Bazı durumlarda, belirli bir parametre değeri için manuel olarak veya kapsamlı arama yoluyla bulunan belirli bir çözümü kodlamak kolay olabilir, ancak genel olarak bu çözümün bir örneği için basit bir kapalı form yoktur, bu nedenle kolayca rasgele girişler için varsayılan bir değer üretmek mümkündür. Yine, bahsettiğiniz örnek için durum böyle değildir, çünkü kimlik matrisi her boyutta çalışır, ancak bu ilgili sorun için en uygun çözümdürgenellikle oldukça düzensiz olduğundan, geçerli değerleri etkin bir şekilde aramadan varsayılan değere sahip olmak mümkün değildir. Varsayılan değer için kaba kuvvet aramasını önlemek için bunu bir zaman sınırı ile birleştirebilirsiniz.

Put bazı olasılık dağılımı üzerindeki kısıtlama

Tamamen kısıtsız bir olasılık dağılımından vazgeçmeye istekliyseniz , bunun üzerine, cevaplayıcılara dağıtımlarını seçerken hala çok fazla özgürlük veren, ancak zor kodlamayı zor veya imkansız hale getiren bazı kısıtlamalar koyabilirsiniz:

  • Akla gelen en basit kısıtlama, olası herhangi bir çıktının belirli bir eşiğin altında olması için minimum ve maksimum olasılık arasındaki farkı gerektirmektir. Sabit kodlu bir yaklaşımın hemen hemen tüm çıktılar için neredeyse sıfır olasılığı ve varsayılan değer için 1'e yakın bir olasılığı olacaktır. Maksimum farkın 0,1'in altında olmasını istiyorsanız, yaklaşımı bir seçenek haline getirmek için 10 (rastgele seçilmiş) varsayılan değerin olması gerekir. Benzer şekilde, her olası çıkış için minimum bir olasılığa ihtiyacınız olabilir, örneğin 1 / (2 * N *), burada N olası çıkışların sayısıdır.
  • Alternatif olarak, dağıtımda (olasılık) boşluk olmamasını isteyebilirsiniz, böylece hem daha yüksek hem de daha düşük olasılıklar olacak şekilde δ (sizin tarafınızdan seçilen) boyut aralığı yoktur. Bu, muhtemelen kodlama yaklaşımıyla üretilen olasılık açısından herhangi bir aykırı değer olamayacağı anlamına gelir.

Bu yaklaşımlarla ilgili asıl mesele, akıl yürütmeleri çok daha zordur, cevapların doğruluğunun kanıtlanması zordur ve deneysel olarak doğruluğu doğrulamak büyük çıktı alanları için imkansız olabilir. Yine de, program için sabit kodlamayı imkansız kılabilecek temelde gözlemlenebilir bir gereksinim sağlarlar.

Varsayılan olmayan değerlerin olasılığını artırmanın bir yolu, varsayılan değere geri dönmeden önce rastgele bir foo bulmaya çalışmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.