using System.ComponentModel.DataAnnotations;
public static void Main()
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,1000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,2000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,3000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,6000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,10000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,20000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,25000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29000000.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29900000.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29990000.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29999000.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29999900.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29999990.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,29999999.99m, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,30000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,31000000, 30000000,1000,1.5m,0.000001m,0.002m)));
Console.WriteLine(AgapsProbabilityCalculator.Calculate(new (3.4m,40000000, 30000000,1000,1.5m,0.000001m,0.002m)));
public sealed class AgapsProbabilityCalculator
public static MathResponse Calculate(MathRequest mathRequest)
var turnoverHit = (mathRequest.HitByAmountInCents - mathRequest.MainPoolAmountCents) / (mathRequest.SharedLevelRtp / 100m);
return new(mathRequest.MaxTriggerProbability, mathRequest.MaxTriggerProbability, mathRequest.MaxTriggerProbability);
var probabilityPreMidPointFactor = mathRequest.TriggerProbabilityBetSizeCents / turnoverHit;
var probabilityPostMidPointFactor = probabilityPreMidPointFactor * mathRequest.MidPointFactor;
if (probabilityPostMidPointFactor < mathRequest.MinTriggerProbability)
return new(probabilityPreMidPointFactor, probabilityPostMidPointFactor, mathRequest.MinTriggerProbability);
if (probabilityPostMidPointFactor > mathRequest.MaxTriggerProbability)
return new(probabilityPreMidPointFactor, probabilityPostMidPointFactor, mathRequest.MaxTriggerProbability);
return new(probabilityPreMidPointFactor, probabilityPostMidPointFactor, probabilityPostMidPointFactor);
public record MathResponse(
decimal ProbabilityPreMidPointFactor
, decimal ProbabilityPostMidPointFactor
public record MathRequest(
, decimal MainPoolAmountCents
, long HitByAmountInCents
, int TriggerProbabilityBetSizeCents
, decimal MinTriggerProbability
, decimal MaxTriggerProbability