コード例 #1
0
        public void PlayGameWithHundredRewardAndGameOver()
        {
            var boxes = new List <Reward> {
                Reward.Hundred,
                Reward.GameOver
            };
            var additionalRewards = new List <AdditionalReward> {
                AdditionalReward.Five
            };
            var simulationDriver = new SimulationDriver(100_000, boxes, additionalRewards);

            var avg = simulationDriver.Run();

            Assert.Equal(55, avg, 0);

            var gamesGenerator = new GamesGenerator();

            gamesGenerator.Generate(RewardListToBoxes(boxes), additionalRewards);

            Assert.Equal(55, gamesGenerator.AverageScore.ToDouble(), 0);
        }
コード例 #2
0
        private void Test(List <Reward> boxes, List <AdditionalReward> additionalRewards)
        {
            var simulationDriver = new SimulationDriver(50_000_000, boxes, additionalRewards);

            var avg = simulationDriver.Run();

            var gamesGenerator = new GamesGenerator();

            gamesGenerator.Generate(RewardListToBoxes(boxes), additionalRewards);

            foreach (var game in gamesGenerator.Games
                     .OrderBy(s => s.GameKey))
            {
                // System.Console.WriteLine($"{game.GameKey}, Probability: {game.Probability} ({game.Probability.ToDouble()})");
            }

            System.Console.WriteLine();

            // var stats = simulationDriver.Stats();

            var stat = gamesGenerator.Games.Select(g => g.GameKey)
                       .Union(simulationDriver.Statistics.Keys)
                       .ToHashSet()
                       .Select(k => new Stat
            {
                GameKey = k
            })
                       .ToDictionary(s => s.GameKey);

            foreach (var s in simulationDriver.Statistics)
            {
                stat[s.Key].Count = s.Value;
            }

            foreach (var game in gamesGenerator.Games)
            {
                stat[game.GameKey].Probability = game.Probability;
            }

            System.Console.WriteLine("Stats:");

            // foreach (var s in stat)
            // {
            //     if (!s.Value.Probability.HasValue)
            //     {
            //         Console.WriteLine($"{s.Value.GameKey}  Count: {s.Value.Count} ({(double)s.Value.Count / simulationDriver.Games.Count})");
            //     }
            //     else if (!s.Value.Count.HasValue)
            //     {
            //         Console.WriteLine($"{s.Value.GameKey}  Probability: {s.Value.Probability} ({s.Value.Probability?.ToDouble()})");
            //     }
            //     else
            //     {
            //         // var prob = s.Value.Probability?.ToDouble();
            //         // var sim = (double)s.Value.Count / simulationDriver.Games.Count;
            //         // Console.WriteLine($"{s.Value.GameKey}  Probability: {s.Value.Probability} ({s.Value.Probability?.ToDouble()}), Count: {s.Value.Count} ({(double)s.Value.Count / simulationDriver.Games.Count})");
            //     }
            // }
            System.Console.WriteLine($"All: {stat.Count()}");
            System.Console.WriteLine($"All simulation games: {simulationDriver.Statistics.Values.Sum()}");
            System.Console.WriteLine($"No probability: {stat.Where(x => !x.Value.Probability.HasValue).Count()}");
            System.Console.WriteLine($"No simulation: {stat.Where(x => !x.Value.Count.HasValue).Count()}");

            foreach (var g in stat.Where(x => !x.Value.Count.HasValue))
            {
                System.Console.WriteLine(g.Key);
            }

            System.Console.WriteLine($"Probability: {gamesGenerator.AverageScore.ToDouble()}");
            System.Console.WriteLine($"Simulation: {avg}");

            Assert.InRange(avg - gamesGenerator.AverageScore.ToDouble(), -0.5, 0.5);
        }