2010-06-02 24 views
1

數據庫中有幾百本書記錄,每個記錄都有一個發佈時間。在網站的主頁上,我需要編寫一些代碼,隨機挑選10本書並放在那裏。要求是新書需要更高的顯示機會。使更近期的物品更容易被繪製

由於時間是一個整數,我想這樣來計算每本書的概率:

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)) 

一本書後得出,下一輪的循環將減去(當前時間 - 從分母出版書的時間)並重新計算每本剩餘書籍的概率,循環繼續,直到繪製了10本書。

該算法是否正確?

順便說一句,該網站是用PHP編寫的。

隨時提出一些PHP代碼,如果你在你的心中更好的算法。

非常感謝大家。

+0

哦,我剛發現這是一個錯誤的。這似乎與我的目的相反。 – bobo 2010-06-02 16:10:46

+0

有人會介意如何修復它嗎? – bobo 2010-06-02 16:12:02

+0

1 - 您的陳述? – halfdan 2010-06-02 16:17:15

回答

1

這裏有一個非常類似的問題,可以幫助:Random weighted choice解決的辦法是在C#中,但代碼可讀性很強,靠近PHP語法所以它應該很容易適應。

例如,這裏有一個如何在MySQL做到這一點:

首先計算所有電子書的總年齡,並將其存儲在MySQL用戶變量:

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

然後選擇書籍隨機,加權通過他們的年齡:

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:[email protected]) 
ORDER BY b.publish_date DESC 
LIMIT 10; 

注意,@total既降低由於短路如果一本書已經通過了隨機選擇的測試, AND表達式。

這並不能保證一次選擇10本書 - 它甚至不保證在給定的通行證上選擇任何書籍。所以你必須重新執行第二步,直到找到10本書。 @total變量保留其減少的值,因此您不必重新計算它。

1

首先,我認爲你的配方會保證早期的書籍被選中。嘗試設置你的初始概率基於:

時代 - 自出版以來天

MAX(年齡) - 最古老的書樣品中

賬齡(I) - 本書的年齡我

...價值e確保了這個價值,我們可以通過這個價值觀來確定這個價值。最古老的書有被選中的概率。現在完成了,您可以隨時重新計算任何樣本的概率。

現在你必須要找到撿書的偏見的方法。最好的辦法是用上面的方法計算累積分佈,然後選擇一個統一的(0,1)r.v.找到那裏r.v.處於累積分佈狀態,並選擇離它最近的書。

不能幫你編碼。合理?