Skip to content

Instantly share code, notes, and snippets.

@greeness
Created December 4, 2012 01:46
Show Gist options
  • Select an option

  • Save greeness/4199796 to your computer and use it in GitHub Desktop.

Select an option

Save greeness/4199796 to your computer and use it in GitHub Desktop.
iap purchase update
public UserIapModel Calculate(double? currentTotalIap,
double? currentElapsedHours,
double? currentPlayedTurns,
double newIap,
double newElapsedHours,
double newPlayedTurns)
{
// default setting for new users: spending $0.01 in every 24 hours or 10 turns
double totalIap = currentTotalIap ?? 0.01;
double totalElapsedHours = currentElapsedHours ?? 24;
double totalPlayedTurns = currentPlayedTurns ?? 10;
// normalized hours should be between 1 hour and 2160 hours (90 days)
var normalizedHours = Math.Max(1., Math.Min(2160, newElapsedHours));
// normalized turns should be between 3 turns and 5000 turns)
var normalizedTurns = Math.Max(3., Math.Min(5000, newPlayedTurns));
// this is the database data access object
var userIapModel = new UserIapModel();
userIapModel.totalIap = totalIap + newIap;
userIapModel.totalElaspedHours = totalElaspedHours + normalizedHours;
userIapModel.totalPlayedTurns = totalPlayedTurns + normalizedTurns;
// metric 1: daily iap
var meanHourlyIap = userIapModel.totalIap/userIapModel.totalElapsedHours;
var stdHourlyIap = Math.Sqrt(userIapModel.totalIap/(userIapModel.totalElaspedHours*userIapModel.totalElaspedHours));
var stdDailyIap = stdHourlyIap*24.0;
userIapModel.meanDailyIap = userIapModel.meanHourlyIap*24.0;
userIapModel.upperBoundDailyIap = userIapModel.meanDailyIap + 2*stdDailyIap;
userIapModel.lowerBoundDailyIap = Math.Max(0.0, userIapModel.meanDailyIap - 2*stdDailyIap);
// metric 2: iap per 100 turns
var meanIapPerTurn = userIapModel.totalIap/userIapModel.totalPlayedTurns;
var stdIapPerTurn = Math.Sqrt(userIapModel.totalIap/(userIapModel.totalPlayedTurns*userIapModel.totalPlayedTurns));
var stdIapPerHundredTurns = stdIapPerTurn*100.0;
userIapModel.meanIapPerHundredTurns = meanIapPerTurn*100.0;
userIapModel.upperBoundIapPerHundredTurns = userIapModel.meanIapPerHundredTurns + 2*stdIapPerHundredTurns;
userIapModel.lowerBoundIapPerHundredTurns = Math.Max(0.0, userIapModel.meanIapPerHundredTurns - 2*stdIapPerHundredTurns);
return userIapModel;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment