C# - Функция случайного выбора четырех строк всегда возвращает каждую строку в одном и том же регистре - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь построить базовый генератор случайных паролей c в форме 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:

enter image description hereenter image description hereenter image description hereenter image description here

4 - заглавная буква первого символа

17 - заглавная буква слова

20 - буква в нижнем регистре

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

Однако все четыре слова имеют заглавную первую букву:

enter image description here:

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

1 Ответ

1 голос
/ 11 января 2020

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

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

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...