Çizilecek daha yeni ürün daha olası hale

2 Cevap php

Orada kitap kayıtları birkaç yüz veritabanında ve her kayıt bir yayımlamak zaman vardır. Web sitesinin ana, ben rastgele 10 kitap almak ve orada onları koymak için bazı kodları yazmak için gerekli. Gereksinimi yeni kitaplar sergilendi alma şansı daha yüksek olması gerektiğidir.

Zaman bir tamsayı olduğundan, ben her kitap için olasılığını hesaplamak için böyle düşünüyorum:

Probability of a book to be drawn = (current time - publish time of the book) / ((current time - publish time of the book1) +  (current time - publish time of the book1) + ... (current time - publish time of the bookn))

Bir kitap çizilir sonra, döngünün sonraki turda eksi olacak - 10 kitap çizilmiş kadar payda dan (şimdiki zaman kitabın süresini yayımlamak) ve kalan kitapların her biri için olasılık yeniden hesaplamak, döngü devam eder.

Bu algoritma doğru biri mi?

Bu arada, web sitesi PHP ile yazılmış.

Eğer kafanızda daha iyi bir algoritma varsa bazı PHP kodları önermek için çekinmeyin.

Hepinize çok teşekkürler.

2 Cevap

İşte size yardımcı olabilecek bir çok benzer bir soru: http://stackoverflow.com/questions/56692/random-weighted-choice çözümü C # ama adapte kolay olmalıdır böylece kod çok okunabilir ve PHP sözdizimi yakındır.

Örneğin, burada bir MySQL bunu nasıl bulunuyor:

Öncelikle tüm kitapların toplam yaşını hesaplamak ve bir MySQL kullanıcı değişkende saklayın:

SELECT SUM(TO_DAYS(CURDATE())-TO_DAYS(publish_date)) FROM books INTO @total;

Sonra rastgele, onların yaş ağırlıklı kitaplar seçin:

SELECT book_id FROM (
  SELECT book_id, TO_DAYS(CURDATE())-TO_DAYS(publish_date) AS age FROM books
) b
WHERE book_id NOT IN (...list of book_ids chosen so far...)
  AND RAND()*@total < b.age AND (@total:=@total-b.age)
ORDER BY b.publish_date DESC
LIMIT 10;

Bir kitap nedeniyle AND ifadelerin Kısa devre rastgele seçim testini geçti, eğer @total sadece azaldığını unutmayın.

Bu bir geçişte 10 kitap seçmek için garanti değil - hatta belirli bir geçişte any kitapları seçmek için garanti değil. Yani 10 kitap buldum kadar ikinci adımı yeniden çalıştırmak zorunda. Bunu yeniden hesaplamak zorunda kalmamak @total değişkeni azalma değerini korur.

Öncelikle ben senin formül önceki kitapları aldı olsun garanti olacağını düşünüyorum. Dayanarak ilk olasılıkları ayarlamak için deneyin:

Yaş - gün yayınlanmasından beri

Max (Yaş) - numunede eski kitap

Kitap Yaş (i) - Kitap i yaşı

Prob ... (i) = [Max (yaş) + e - Kitap Yaş (i)] bütün i aşkın / sum [Max (yaş) + e - Kitap yaş (i)]

Değeri e eski kitap seçilmiş olmanın bazı olasılığına sahiptir sağlar. Şimdi bu yapılır ki, sen her zaman örnek prob ReCalc edebilirsiniz.

Şimdi kitap toplama tarafsız bir yol bulmak zorunda. Muhtemelen en iyi yolu, daha sonra bir üniforma (0,1) rv almak yukarıdaki kullanarak kümülatif dağılımını hesaplamak olacaktır Bul nerede R.V. kümülatif dağılımının olduğunu ve ona en yakın kitap almak.

Kodlama size yardımcı olamaz. Mantıklı?