Reddits công thức cũ và một chút thả ra
Về cơ bản, bạn có thể sử dụng công thức Reddit của. Kể từ khi hệ thống của bạn chỉ hỗ trợ upvotes bạn có thể cân nặng họ, dẫn đến một cái gì đó như thế này:
def hotness(track)
s = track.playedCount
s = s + 2*track.downloadCount
s = s + 3*track.likeCount
s = s + 4*track.favCount
baseScore = log(max(s,1))
timeDiff = (now - track.uploaded).toWeeks
if(timeDiff > 1)
x = timeDiff - 1
baseScore = baseScore * exp(-8*x*x)
return baseScore
Yếu tố exp(-8*x*x)
sẽ cung cấp cho bạn thả mong muốn của bạn off:

Những điều cơ bản đằng sau
Bạn có thể sử dụng bất kỳ chức năng nào đi nhanh hơn số điểm của bạn. Vì chúng tôi sử dụng log
trên điểm số của mình, ngay cả một hàm tuyến tính cũng có thể nhân lên (miễn là điểm của bạn không tăng theo cấp số nhân).
Vì vậy, tất cả những gì bạn cần là một hàm trả về 1
miễn là bạn không muốn sửa đổi điểm số và sau đó giảm xuống. Ví dụ của chúng tôi ở trên các biểu mẫu có chức năng:
multiplier(x) = x > 1 ? exp(-8*x*x) : 1
Bạn có thể thay đổi hệ số nếu bạn muốn ít đường cong dốc hơn. 
Ví dụ trong C++
Cho phép nói rằng xác suất cho một ca khúc đưa ra để được chơi trong một giờ nhất định là 50%, 10% tải, như 1% và 0,1% yêu thích. Sau đó, chương trình sau C++ sẽ cung cấp cho bạn một ước tính cho hành vi điểm số của bạn:
#include <iostream>
#include <fstream>
#include <random>
#include <ctime>
#include <cmath>
struct track{
track() : uploadTime(0),playCount(0),downCount(0),likeCount(0),faveCount(0){}
std::time_t uploadTime;
unsigned int playCount;
unsigned int downCount;
unsigned int likeCount;
unsigned int faveCount;
void addPlay(unsigned int n = 1){ playCount += n;}
void addDown(unsigned int n = 1){ downCount += n;}
void addLike(unsigned int n = 1){ likeCount += n;}
void addFave(unsigned int n = 1){ faveCount += n;}
unsigned int baseScore(){
return playCount +
2 * downCount +
3 * likeCount +
4 * faveCount;
}
};
int main(){
track test;
const unsigned int dayLength = 24 * 3600;
const unsigned int weekLength = dayLength * 7;
std::mt19937 gen(std::time(0));
std::bernoulli_distribution playProb(0.5);
std::bernoulli_distribution downProb(0.1);
std::bernoulli_distribution likeProb(0.01);
std::bernoulli_distribution faveProb(0.001);
std::ofstream fakeRecord("fakeRecord.dat");
std::ofstream fakeRecordDecay("fakeRecordDecay.dat");
for(unsigned int i = 0; i < weekLength * 3; i += 3600){
test.addPlay(playProb(gen));
test.addDown(downProb(gen));
test.addLike(likeProb(gen));
test.addFave(faveProb(gen));
double baseScore = std::log(std::max<unsigned int>(1,test.baseScore()));
double timePoint = static_cast<double>(i)/weekLength;
fakeRecord << timePoint << " " << baseScore << std::endl;
if(timePoint > 1){
double x = timePoint - 1;
fakeRecordDecay << timePoint << " " << (baseScore * std::exp(-8*x*x)) << std::endl;
}
else
fakeRecordDecay << timePoint << " " << baseScore << std::endl;
}
return 0;
}
Kết quả:

Như vậy là đủ cho bạn.
Vậy câu hỏi là gì? –
Nội dung nóng với thời gian phân rã? Bạn đang nói về [phương trình nhiệt] (http://en.wikipedia.org/wiki/Heat_equation)? Không, nghiêm túc, bạn phải suy nghĩ về điều này cho mình - mặc dù phương trình nhiệt có thể cung cấp cho bạn một số ý tưởng. – Zeta
cũng câu hỏi thực sự là loại phương trình tôi đang tìm kiếm, tôi giả sử Zeta trả lời này. Tôi không thực sự nóng về toán học và phương trình ở cấp độ này, tôi đã hy vọng một người nào đó có kinh nghiệm với điều này trước đây và tìm thấy một số blog hữu ích, v.v. –