Guest User

Untitled

a guest
May 16th, 2018
350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. void Main()
  2. {
  3. GetPassFailRateWithConfidence(10, 2, 0.95).ToString().Dump();
  4. GetPassFailRateWithConfidence(100, 20, 0.95).ToString().Dump();
  5. GetPassFailRateWithConfidence(1000, 200, 0.95).ToString().Dump();
  6. GetPassFailRateWithConfidence(10000, 2000, 0.95).ToString().Dump();
  7. }
  8.  
  9. public ErrorRate GetPassFailRateWithConfidence(long passes, long fails, double confidence)
  10. {
  11. double fact(long n) => Math.Round(Math.Sqrt(Math.PI * (2 * n + 1.0 / 3)) * Math.Pow(n / Math.E, n));
  12.  
  13. double nCr(long n, long r) =>
  14. fact(n).Dump() / (fact(r) * fact(n - r));
  15.  
  16. long gcd(long a, long b) => b > 0
  17. ? gcd(b, a % b)
  18. : a;
  19.  
  20. double nCr2(long n, long r, double factor)
  21. {
  22. if (r > n / 2) r = n - r;
  23.  
  24. double ans = factor;
  25. for (long i = 1; i <= r; i++)
  26. {
  27. var num = (n - r + i);
  28. var divisor = gcd(num, i);
  29. ans *= (num / divisor);
  30. ans /= (i / divisor);
  31. }
  32.  
  33. return ans;
  34. }
  35.  
  36. var total = passes + fails;
  37. var θ = (passes + 0.5) / (total + 1);
  38.  
  39. double P(long p) =>
  40. nCr2(total, p, Math.Pow(θ, p) * Math.Pow(1 - θ, total - p));
  41.  
  42. var minThreshold = (1 - confidence) / 2;
  43. var maxThreshold = 1 - minThreshold;
  44. var sum = 0.0;
  45. double? min = default;
  46. double? max = default;
  47. for (var i = 0; i <= total; i++)
  48. {
  49. if (sum >= maxThreshold && max == null)
  50. {
  51. max = (double)i / total;
  52. break;
  53. }
  54.  
  55. sum += P(i);
  56. //sum.Dump();
  57.  
  58. if (sum >= minThreshold && min == null)
  59. {
  60. min = (double)i / total;
  61. }
  62. }
  63.  
  64. if (max == null)
  65. {
  66. max = 1;
  67. }
  68.  
  69. return new ErrorRate(mean: (double)passes / total, min: min.Value, max: max.Value, confidence: confidence);
  70. }
  71.  
  72. public class ErrorRate
  73. {
  74. public ErrorRate(double mean, double min, double max, double confidence)
  75. {
  76. this.Mean = mean;
  77. this.Min = min;
  78. this.Max = max;
  79. this.Confidence = confidence;
  80. }
  81.  
  82. public double Mean { get; }
  83. public double Min { get; }
  84. public double Max { get; }
  85. public double Confidence { get; }
  86.  
  87. public override string ToString()
  88. {
  89. return $"{this.Mean:P} ({this.Min:P}-{this.Max:P} @{this.Confidence:P})";
  90. }
  91. }
Add Comment
Please, Sign In to add comment