генерация случайной строки - две сгенерированные одна за другой дают одинаковые результаты - PullRequest
2 голосов
/ 18 декабря 2008

У меня есть простой кусок кода:

public string GenerateRandomString()
        {
            string randomString = string.Empty;
            Random r = new Random();
            for (int i = 0; i < length; i++)
                randomString += chars[r.Next(chars.Length)];

            return randomString;
        }

Если я вызываю эту функцию для генерации двух строк, одна за другой, они идентичны ... но если я отлаживаю через две строки, где генерируются строки - результаты будут разными. Кто-нибудь знает, почему это происходит?

Ответы [ 5 ]

6 голосов
/ 18 декабря 2008

Это происходит, потому что вызовы происходят очень близко друг к другу (в течение одной и той же миллисекунды), тогда конструктор Random будет инициировать объект Random с тем же значением (по умолчанию он использует дату и время).

Итак, на самом деле есть два решения.

1. Укажите свое собственное начальное значение , которое будет уникальным при каждом создании объекта Random.

2. Всегда используйте один и тот же объект Random - создайте его только один раз.

Лично я бы использовал второй подход. Это можно сделать, сделав объект Random статическим или сделав его членом класса.

5 голосов
/ 18 декабря 2008

Ответы выше верны. Я бы предложил следующие изменения в вашем коде:

1) Я бы предложил использовать StringBuilder вместо добавления строки постоянно. Строки являются неизменяемыми, поэтому при каждом добавлении новой строки создается новая строка. Если вы никогда не использовали StringBuilder, посмотрите его. Это очень полезно для такого рода работы.

2) Вы можете упростить повторное использование метода, если передадите длину в сам метод. Возможно, вы могли бы также передать массив chars, но я пропустил это.

3) Используйте каждый раз один и тот же случайный объект, как предложено выше.

public string GenerateRandomString(int length)
{
    StringBuilder randomString = new StringBuilder(length);

    for (int i = 0; i < length; i++)
        randomString.Append(chars[(int)(_RandomObj.Next(chars.Length))].ToString());

     return randomString.ToString();
}
2 голосов
/ 18 декабря 2008

Это потому, что вы создаете два случайных объекта одновременно. Это дает ему то же самое семя, поэтому вы получите те же цифры.

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

1 голос
/ 19 октября 2013

Поскольку генератор Random связан с системными часами, вы, вероятно, отображаете те же результаты с этим периодом времени. Есть несколько способов исправить. Если вы используете циклы, поместите Random rnd = new Random(); вне цикла.

Поместите строку Random rnd = new Random();, где вы объявляете свои переменные, и используйте одну и ту же переменную в вашей программе (rnd для этого примера).

Это будет работать в большинстве случаев.

1 голос
/ 18 декабря 2008

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

Я предлагаю использовать статический объект Random и инициализировать его только один раз.

...