public string Generate(PasswordGenerationParameters parameters)
        {
            parameters.ThrowIfNull(nameof(parameters));

            // Create character set based on parameters
            var charSet  = new StringBuilder();
            var password = new StringBuilder(parameters.Length);

            IncludeCharacters(charSet, SpecialCharacters, parameters.IncludeSpecialCharacters);
            IncludeCharacters(charSet, LowerCaseCharacters, parameters.IncludeLowerCaseCharacters);
            IncludeCharacters(charSet, UpperCaseCharacters, parameters.IncludeUpperCaseCharacters);
            IncludeCharacters(charSet, NumericCharacters, parameters.IncludeNumericCharacters);
            ExcludeCharacters(charSet, SimilarCharacters, parameters.ExcludeSimilarCharacters);
            ExcludeCharacters(charSet, AmbiguousCharacters, parameters.ExcludeAmbiguousCharacters);

            var length = parameters.Length;

            // Randomly choose a letter from character set & append it to the password
            while (length-- > 0)
            {
                password.Append(charSet[Math.Abs(generator.GetInt32()) % charSet.Length]);
            }

            return(password.ToString());
        }