четверг, 14 июля 2011 г.

Генерация числа и строки заданной длины.

Общие сведения о System.Random
Класс Random, определенный в библиотеке классов .NET предлагает возможность генерировать числа.
У класса Random есть 3 public метода, позволяющих сгенерировать число тем или иным способом: Next, NextBytes и NextDouble. Next возвращает случайное число, NextBytes возвращает массив байтов заполненный случайнми числами, NextDouble возвращает случайное число в диапазоне от 0.0 до 1.0.
Метод Next существует в 3 перегруженных формах, которые позволяют задать минимальный и максимальный диапазон для генерации случайного числа.
Но класс Random не предоставляет функциональности для генерации строки символов определенной длины. Но у нас есть все средства под рукой для написания подобных методов.

Генерация числа заданной длины
Начнем с генерации числа определенной разрядности. Скажем, к примеру, нам нужно сгенерировать число длиной в 5 символов. Мы можем использовать метод Random.Next с указанием диапазона, к примеру:
Random random = new Random();
random.Next(10000, 99999);
Но если нам каждый раз необходимо генерировать числа различной разрядности, то указанный вариант не очень подходит.
Для решения данной задачи создадим метод, который в качестве параметра будет принимать разрядность возвращаемого числа:
public static int RandomInt(int size)
{
    Random random = new Random();
    int result = 0;
    for (int i = 0; i < size; i++)
    {
        //Генерируем число от 0 до 9, заполняем им разряд.
        result = (int)((result * 10) + (random.NextDouble() * 9));

        //Целое число не может начинаться с 0, если его разрядность больше 1
        if (size > 1 && result == 0)
            result++;
    }
    return result;
}
Вызов данного метода:
Console.WriteLine("RandomInt(5): {0}", RandomInt(5));
даст, например, такой результат:
RandomInt(5): 73842

Генерация строки заданной длины
Для генерации строки заданной длины немного изменим наш метод RandomInt():
public static string RandomString(int size)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;
    for (int i = 0; i < size; i++)
    {
        //Генерируем число являющееся латинским символом в юникоде
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
        //Конструируем строку со случайно сгенерированными символами
        builder.Append(ch);
    }
    return builder.ToString();
}
Вызов данного метода:
Console.WriteLine("RandomString(5): {0}", RandomString(5));
даст, например, такой результат:
RandomString(5): HDYFN

Комментариев нет:

Отправить комментарий