public static double Score(double[] ratings, double[] prior = null, double[] util = null, double z = 1.65){
prior = prior ?? new[]{ 0d, 0d, 0d, 0d, 0d };
util = util ?? new[]{ 1d, 2d, 3d, 4d, 5d };
var ns = ratings.Zip(prior, (r, p) => r + p).ToArray();
var s2 = s.Select(x => x*x).ToArray();
Func<double[], double> f = (fs) => {
return fs.Zip(ns, (fsk, nk) => fsk*(nk+1)).Sum() / (N+K);
return fsns - z * Math.Sqrt((f(s2) - (fsns*fsns)) / (N+K+1));
public static double Width(double[] ratings, double[] prior = null, double[] util = null, double z = 1.65){
prior = prior ?? new[]{ 1d, 1d, 1d, 1d, 1d };
util = util ?? new[]{ 1d, 2d, 3d, 4d, 5d };
var ns = ratings.Zip(prior, (r, p) => r + p).ToArray();
var s2 = s.Select(x => x*x).ToArray();
Func<double[], double> f = (fs) => {
return fs.Zip(ns, (fsk, nk) => fsk*(nk+1)).Sum() / (N+K);
return 2 * z * Math.Sqrt((f(s2) - (fsns*fsns)) / (N+K+1));
public static void Main()
var ratingCounts = new[]{ 0d, 0d, 0d, 0d, 40d };
var score = Score(ratingCounts);
var width = Width(ratingCounts);
Console.WriteLine(score);
Console.WriteLine(width);