c# - generate - генерация случайных строк-две генерируемые один за другим дают одинаковые результаты




random next string c# (4)

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

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

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

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();
}

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

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;
        }

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


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

Мое предложение - использовать статический случайный объект и инициализировать его только один раз.


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

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

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

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

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


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

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

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





random