private AkinatorAnswer SupposeInternal(CharacterEntry character)
 {
     _characterToSuppose = character;
     return(new AkinatorAnswer
     {
         AkinatorAnswerType = AkinatorAnswerType.Answer,
         Message = "Предпологаю, что это " + character.Name,
         CharacterToSuppose = character
     });
 }
        public void AddCharacter(CharacterEntry character)
        {
            _charactersWithProbability.Add(new CharacterWithProbability
            {
                Character   = character,
                Probability = 0.5
            });

            RecalculateEnd(character);
        }
        private int GetBestQuestion(CharacterEntry bestCharacter)
        {
            var questions = bestCharacter.Questions
                            .Where(x => _history.All(y => y.QuestionId != x.Id))
                            .ToArray();
            var maxP = questions.Max(x => x.Probability);
            var ids  = questions.Where(x => x.Probability >= maxP)
                       .Select(x => x.Id).ToArray();

            if (ids.Length == 1)
            {
                return(ids[0]);
            }
            return(ids[_random.Next(ids.Length - 1)]);
        }
        private void RecalculateEnd(CharacterEntry character)
        {
            if (character == null)
            {
                return;
            }

            foreach (var question in _history)
            {
                var characterQuestion = character.Questions.First(x => x.Id == question.QuestionId);
                var yes = question.UserAnswer == UserAnswer.Yes;
                characterQuestion.Probability =
                    (characterQuestion.Count * characterQuestion.Probability + (yes ? 1 : 0))
                    / (characterQuestion.Count + 1);
                if (yes)
                {
                    characterQuestion.Count++;
                }
            }

            character.Count++;
        }