public static FracClass computeAnswer(bool[] gondalas) { FracClass sum = 0; WheelLargeSlow dp = new WheelLargeSlow(gondalas); for (int i = 0; i < gondalas.Length; ++i) { if (gondalas[i]) continue; int nextI = (i + 1) % gondalas.Length; FracClass probIFilledLast = dp.P(nextI, i); FracClass expValue = dp.E(nextI, i); #if USE_DOUBLE expValue += (double) (gondalas.Length + 1) / 2d; #else expValue += new FracClass(gondalas.Length + 1, 2); #endif sum += probIFilledLast * expValue; Preconditions.checkState(sum >= 0); } return sum; }
public void TestP() { bool[] gondolas = new bool[] { false, false, true, false, true }; WheelLargeSlow dp = new WheelLargeSlow(gondolas); Assert.AreEqual((double)new BigFraction(12, 64), (double)dp.P(0, 3)); gondolas = new bool[] { false, true, false, true, false }; dp = new WheelLargeSlow(gondolas); Assert.AreEqual((double)new BigFraction(12, 64), (double)dp.P(4, 2)); }
public void TestCompare() { int trials = 100; Random r = new Random(3); for(int t = 0; t < trials; ++t) { bool[] gondolas = new bool[7]; for(int i = 0; i < gondolas.Length; ++i) { gondolas[i] = r.Next(2) == 1 ? true : false; } int start = r.Next(0, gondolas.Length); int stop = r.Next(0, gondolas.Length); gondolas[start] = false; gondolas[stop] = false; WheelLargeSlow dp = new WheelLargeSlow(gondolas); Logger.LogTrace("Gondolas {} start {} stop {}", gondolas.ToCommaString(), start, stop); Assert.AreEqual((double)WheelBruteForce.P_bruteForce(gondolas, start, stop), (double)dp.P(start, stop), 1e-9, gondolas.ToCommaString()); } }