С# - функция для случайного выбора четырех строк всегда возвращает каждую строку в одном и том же случае

Я пытаюсь создать базовый генератор случайных паролей в форме Windows. У меня есть список слов (все в нижнем регистре), четыре из которых выбираются случайным образом. Каждое слово передается функции для случайного изменения регистра (начинает с заглавной буквы, делает с заглавной все слово или просто возвращает строку в нижнем регистре), а затем добавляется в другой список следующим образом:

var dictionary = new List<String> { "aaron", "abandoned", "aberdeen" etc... };
int index;
index = random.Next(dictionary.Count);
string one = dictionary[index];
one = randomCase(one);
pwarray.Add(one);

Затем этот код дублируется для строк two, three и four. Моя функция рандомизировать случай, хотя и не фантазия, такова:

        private string randomCase (string word)
        {
            string changed;
            Random r = new Random();
            int n = r.Next(1, 29);

            // Output number to check it's not the same each time
            MessageBox.Show(n.ToString());
            if (n >= 1 || n <= 9)
            {
                // First letter capatalised
                changed = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower());
                return changed;
            }
            else if (n >= 10 || n <= 19)
            {
                // Word capitalised 
                changed = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToUpper());
                return changed;
            }
            else if (n >= 20 || n <= 29)
            {
                // Word left as lower case
                return word;
            }

            return null;
        }

Я добавил окна выходных сообщений, чтобы показать, что такое случайное число n, чтобы помочь в устранении неполадок. Когда я запускаю приложение, я получаю разные числа из моей функции randomCase для n:

введите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображения

4 - Первый символ с большой буквы

17 - Слово с заглавной буквы

20 - Слово оставлено в нижнем регистре

24 - слово оставлено в нижнем регистре

Однако во всех четырех словах первая буква была заглавной:

введите здесь описание изображения:

Я сгенерировал много паролей, и они всегда выглядят одинаково - только первая буква заглавная. Кто-нибудь может предложить какие-либо предложения?


person Rawns    schedule 10.01.2020    source источник
comment
Создайте массив допустимых символов пароля, то есть char[] passwordChars = new char[] { 'a', 'b', 'c', etc. }, затем создайте построитель строк. Затем добавьте случайный индекс из passwordChars passwordLen раз.   -  person jjxtra    schedule 11.01.2020
comment
это то, что делает TextInfo.ToTitleCase ... и вы использовали его в 2 случаях ... но, очевидно, используется только первый ... проблема в разнице между and и or ... числа между 1 и 29 всегда больше ( или экв.) больше 1 или меньше (или экв.) 9   -  person Selvin    schedule 11.01.2020
comment
Почему у него +1? это похоже на опечатку и не заслуживает +1   -  person Selvin    schedule 11.01.2020
comment
Ваши случаи перекрываются, потому что вы используете или логику вместо и. Например,. вместо (n >= 1 || n <= 9) должно быть (n >= 1 && n <= 9).   -  person John Wu    schedule 11.01.2020


Ответы (1)


Вы должны либо создать экземпляр Random внутри класса, либо вам нужно заполнять его каждый раз, когда вы его создаете. Вы также должны использовать &&, потому что вы хотите, чтобы оба теста в if оставались верными.

Если я использую следующий код:

    private static string randomCase(string word)
    {
        string changed;
        Random r = new Random(Guid.NewGuid().GetHashCode());
        int n = r.Next(1, 29);

        // Output number to check it's not the same each time
        //MessageBox.Show(n.ToString());
        //Console.WriteLine(n.ToString());
        if (n >= 1 && n <= 9)
        {
            // First letter capatalised
            changed = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower());
            return changed;
        }
        else if (n >= 10 && n <= 19)
        {
            // Word capitalised 
            changed = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToUpper());
            return changed;
        }
        else if (n >= 20 && n <= 29)
        {
            // Word left as lower case
            return word;
        }

        return null;
    }
    public static void Main(string[] args)
    {
        //Your code goes here
        for (int i = 0; i < 10; i++)
            Console.WriteLine(randomCase("heLLo"));
    }

Я получу следующий вывод:

HELLO
HELLO
Hello
heLLo
HELLO
Hello
Hello
HELLO
HELLO
HELLO
person Natalie Adams    schedule 10.01.2020