Генератор случайных строк, возвращающий ту же строку [дубликат]

This question already has an answer here:

Random number generator only generating one random number 9 answers

Я разработал генератор случайных строк, но он ведет себя не совсем так, как я надеюсь. Моя цель состоит в том, чтобы иметь возможность выполнить это дважды и сгенерировать две разные случайные строки из четырех символов. Однако он просто генерирует одну четырехзначную случайную строку дважды.

Вот код и пример его вывода:

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

// get 1st random string 
string Rand1 = RandomString(4);

// get 2nd random string 
string Rand2 = RandomString(4);

// create full rand string
string docNum = Rand1 + "-" + Rand2;

... и результат выглядит так: UNTE-UNTE ... но это должно выглядеть примерно так: UNTE-FWNU

Как я могу обеспечить две совершенно случайные строки?

 anaximander17 июн. 2013 г., 16:57
Есть ли какая-то причина, по которой вы не можете просто сгенерировать одну строку, которая в два раза длиннее, а затем вставить дефис в ее середину?
 CodesInChaos19 нояб. 2012 г., 11:03
Обратите внимание, что даже две совершенно случайные строки не гарантированно являются уникальными. С длинными строками (более 120 бит) очень вероятно, что они уникальны, но с такими короткими строками коллизии являются обычным явлением.
 mola1002 нояб. 2011 г., 09:58
stackoverflow.com/questions/4616685/…    Хорошая производительность

Ответы на вопрос(30)

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

Работает отлично.

public static string GeneratePassword(int Lenght, int NonAlphaNumericChars)
    {
        string allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
        string allowedNonAlphaNum = "[email protected]#$%^&*()_-+=[{]};:<>|./?";
        Random rd = new Random();

        if (NonAlphaNumericChars > Lenght || Lenght <= 0 || NonAlphaNumericChars < 0)
            throw new ArgumentOutOfRangeException();

            char[] pass = new char[Lenght];
            int[] pos = new int[Lenght];
            int i = 0, j = 0, temp = 0;
            bool flag = false;

            //Random the position values of the pos array for the string Pass
            while (i < Lenght - 1)
            {
                j = 0;
                flag = false;
                temp = rd.Next(0, Lenght);
                for (j = 0; j < Lenght; j++)
                    if (temp == pos[j])
                    {
                        flag = true;
                        j = Lenght;
                    }

                if (!flag)
                {
                    pos[i] = temp;
                    i++;
                }
            }

            //Random the AlphaNumericChars
            for (i = 0; i < Lenght - NonAlphaNumericChars; i++)
                pass[i] = allowedChars[rd.Next(0, allowedChars.Length)];

            //Random the NonAlphaNumericChars
            for (i = Lenght - NonAlphaNumericChars; i < Lenght; i++)
                pass[i] = allowedNonAlphaNum[rd.Next(0, allowedNonAlphaNum.Length)];

            //Set the sorted array values by the pos array for the rigth posistion
            char[] sorted = new char[Lenght];
            for (i = 0; i < Lenght; i++)
                sorted[i] = pass[pos[i]];

            string Pass = new String(sorted);

            return Pass;
    }
 19 нояб. 2012 г., 11:00
Еще раз показывает, что безопасность сложно проверить. Хотя это "отлично работает" это небезопасно. Используйте безопасный PRNG для генерации паролей.

Guid.NewGuid().ToString() 
 14 февр. 2014 г., 05:09
Это может генерировать случайную строку, вот и все. Хотя она не может генерировать ту же последовательность.
 17 февр. 2014 г., 09:49
Это происходит для генерации в основном случайной строки (ее части не являются случайными) в текущей реализации. Он не гарантированно является случайным, прошлые реализации не были случайными, и будущие реализации также могут быть не случайными.
 29 окт. 2013 г., 16:52
Смысл GUID в том, что он уникален, а не случайен. Если бы вы использовали его в качестве уникального идентификатора, я бы не стал жаловаться, но вы продаете его как случайную строку, какой она является в настоящее время, но не гарантирует, что она будет. (И благодаря проблеме дня рождения вам нужно всего около 2 ^ 61 значений, чтобы получить дубликат, а не 2 ^ 122, так что ваши «триллионы лет» на самом деле составляют всего около 75 миллионов лет)
 29 окт. 2013 г., 10:26
GUID не гарантированно являются случайными, поэтому вы не должны злоупотреблять ими как PRNG. Текущая реализация в Windows является случайной, но в более старых версиях она основывалась на MAC-адресе и времени. Кто знает, какие будущие версии будут использовать.
 29 окт. 2013 г., 16:42
Я так не думаю. В настоящее время многие люди используют GUID в качестве первичного ключа, и да, GUID может конфликтовать, но2^128 выписано примерно:34,028,236,692,093,846,346,337,460,743,177,000,000, Статистически, если бы вы вычисляли 1000 GUID каждую секунду, для создания дубликата все равно потребовались бы триллионы лет. Кстати, использовать guid очень просто, я не думаю, что это плохая идея.

разованием base64

public string GenRandString(int length)
{
  byte[] randBuffer = new byte[length];
  RandomNumberGenerator.Create().GetBytes(randBuffer);
  return System.Convert.ToBase64String(randBuffer).Remove(length);
}
 18 дек. 2012 г., 10:47
Правда. Однако я предпочитаю это, чем членство. GeneratePassword ()
 06 янв. 2013 г., 09:09
return System.Convert.ToBase64String (randBuffer) .Replace (& quot; / quot ;, "). Replace (" + "," & quot; "). Replace (& quot; = & quot; & quot; & quot;" " ) .Remove (длина);
 19 нояб. 2012 г., 10:58
Обратите внимание, что результат может содержать/ а также+.

Random объект внутри вашего метода.

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

Чтобы решить проблему, переместитеRandom экземпляр вне самого метода (и пока вы на нем, вы можете избавиться от этой безумной последовательности вызововConvert а такжеFloor а такжеNextDouble):

private readonly Random _rng = new Random();
private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

private string RandomString(int size)
{
    char[] buffer = new char[size];

    for (int i = 0; i < size; i++)
    {
        buffer[i] = _chars[_rng.Next(_chars.Length)];
    }
    return new string(buffer);
}
 14 июл. 2009 г., 00:50
Или сделайте это статичным и внутренним для класса.
 14 июл. 2009 г., 01:08
Также мне нравится делать такой метод методом расширения в Random.
 14 окт. 2010 г., 20:28
Обратите внимание, что члены экземпляра класса Random НЕ документированы как поточно-ориентированные, поэтому, если этот метод вызывается из нескольких потоков одновременно (весьма вероятно, например, если вы создаете веб-приложение), то поведение этого код будет неопределенным. Вам нужно либо использовать случайную блокировку, либо сделать ее для каждого потока.

private static Random Random)...

public static string RandomString(int length)
{
    return new string(Enumerable.Range(0, length).Select(_ => (char)Random.Next('a', 'z')).ToArray());
}

Тест производительности Visual Studio генерировать случайные строки, содержащие только буквенно-цифровые символы.

public string GenerateRandomString(int stringLength)
{
    Random rnd = new Random();
    Guid guid;
    String randomString = string.Empty;

    int numberOfGuidsRequired = (int)Math.Ceiling((double)stringLength / 32d);
    for (int i = 0; i < numberOfGuidsRequired; i++)
    {
        guid = Guid.NewGuid();
        randomString += guid.ToString().Replace("-", "");
    }

    return randomString.Substring(0, stringLength);
}

что каждый новый экземпляр Random генерирует одинаковые числа из-за быстрого вызова.Do not продолжайте создавать новый экземпляр, просто вызовите next () и объявите ваш случайный класс за пределами вашего метода.

Another sample (tested in vs2013):

        public static string GetRandomString(int Length)
    {
        char[] ArrRandomChar = new char[Length];
        for (int i = 0; i < Length; i++)
            ArrRandomChar[i] = (char)('a' + R.Next(0, 26));
        return new string(ArrRandomChar);
    }

    string D = GetRandomString(12);

Реализовано мной.

public static class StringHelpers
{
    public static readonly Random rnd = new Random();

    public static readonly string EnglishAlphabet = "abcdefghijklmnopqrstuvwxyz";
    public static readonly string RussianAlphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";

    public static unsafe string GenerateRandomUTF8String(int length, string alphabet)
    {
        if (length <= 0)
            return String.Empty;
        if (string.IsNullOrWhiteSpace(alphabet))
            throw new ArgumentNullException("alphabet");

        byte[] randomBytes = rnd.NextBytes(length);

        string s = new string(alphabet[0], length);

        fixed (char* p = s)
        {
            for (int i = 0; i < s.Length; i++)
            {
                *(p + i) = alphabet[randomBytes[i] % alphabet.Length];
            }
        }
        return s;
    }

    public static unsafe string GenerateRandomUTF8String(int length, params UnicodeCategory[] unicodeCategories)
    {
        if (length <= 0)
            return String.Empty;
        if (unicodeCategories == null)
            throw new ArgumentNullException("unicodeCategories");
        if (unicodeCategories.Length == 0)
            return rnd.NextString(length);

        byte[] randomBytes = rnd.NextBytes(length);

        string s = randomBytes.ConvertToString();
        fixed (char* p = s)
        {
            for (int i = 0; i < s.Length; i++)
            {
                while (!unicodeCategories.Contains(char.GetUnicodeCategory(*(p + i))))
                    *(p + i) += (char)*(p + i);
            }
        }
        return s;
    }
}

Вам также понадобится это:

public static class RandomExtensions
{
    public static string NextString(this Random rnd, int length)
    {
        if (length <= 0)
            return String.Empty;

        return rnd.NextBytes(length).ConvertToString();
    }

    public static byte[] NextBytes(this Random rnd, int length)
    {
        if (length <= 0)
            return new byte[0];

        byte[] randomBytes = new byte[length];
        rnd.NextBytes(randomBytes);
        return randomBytes;
    }
}

И это:

public static class ByteArrayExtensions
{
    public static string ConvertToString(this byte[] bytes)
    {
        if (bytes.Length <= 0)
            return string.Empty;

        char[] chars = new char[bytes.Length / sizeof(char)];
        Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }
}

public System.String GetRandomString(System.Int32 length)
{
    System.Byte[] seedBuffer = new System.Byte[4];
    using (var rngCryptoServiceProvider = new System.Security.Cryptography.RNGCryptoServiceProvider())
    {
        rngCryptoServiceProvider.GetBytes(seedBuffer);
        System.String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        System.Random random = new System.Random(System.BitConverter.ToInt32(seedBuffer, 0));
        return new System.String(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
    }
}

заходящих и что бы иметь случайную строку в одной строке кода

int yourRandomStringLength = 12; //maximum: 32
Guid.NewGuid().ToString("N").Substring(0, yourRandomStringLength);

PS: пожалуйста, имейте в виду, чтоyourRandomStringLength не может превышать 32 какGuid имеет максимальную длину 32.

 23 окт. 2012 г., 20:08
Мне просто нужно 5-символьный временный пароль для хеширования. Это замечательно, спасибо.
 25 июн. 2012 г., 16:28
Я не уверен, что это обязательно будет случайным. GUID разработаны так, чтобы быть уникальными, а не случайными, поэтому возможно, что первые N символов в строке могут быть идентичными (в зависимости от генератора GUID).

public static string GenerateRandomString(int length)
    {
        {
            string randomString= string.Empty;

            while (randomString.Length <= length)
            {
                randomString+= Path.GetRandomFileName();
                randomString= randomString.Replace(".", string.Empty);
            }

            return randomString.Substring(0, length);
        }
    }

private string RandomString(int length)
{
    char[] symbols = { 
                            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
                            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'                             
                        };

    Stack<byte> bytes = new Stack<byte>();
    string output = string.Empty;

    for (int i = 0; i < length; i++)
    {
        if (bytes.Count == 0)
        {
            bytes = new Stack<byte>(Guid.NewGuid().ToByteArray());
        }
        byte pop = bytes.Pop();
        output += symbols[(int)pop % symbols.Length];
    }
    return output;
}

// get 1st random string 
string Rand1 = RandomString(4);

// get 2nd random string 
string Rand2 = RandomString(4);

// create full rand string
string docNum = Rand1 + "-" + Rand2;

без навороченных математических и магических цифр. Но с некоторой волшебной строкой, которая определяет разрешенные символы.

Update: Я сделал генератор статическим, чтобы он не возвращал одну и ту же строку при вызове несколько раз. Однако этот кодnot thread-safe и определенноnot cryptographically secure.

Для генерации пароляSystem.Security.Cryptography.RNGCryptoServiceProvider должен быть использован.

private Random _random = new Random(Environment.TickCount);

public string RandomString(int length)
{
    string chars = "0123456789abcdefghijklmnopqrstuvwxyz";
    StringBuilder builder = new StringBuilder(length);

    for (int i = 0; i < length; ++i)
        builder.Append(chars[_random.Next(chars.Length)]);

    return builder.ToString();
}
 08 мая 2013 г., 14:11
это сгенерирует одну и ту же строку, если вы вызовете ее несколько раз ..
 23 мая 2013 г., 12:35
Спасибо @ stian.net, я сделал генератор статическим.

который использует семя для генератора случайных чисел. Мне нужно было создать серию псевдо-читаемых «слов».

private int RandomNumber(int min, int max, int seed=0)
{
    Random random = new Random((int)DateTime.Now.Ticks + seed);
    return random.Next(min, max);
}
 01 нояб. 2012 г., 03:48
@xiaomao Я бы не стал называть более 3 лет одной предыдущей полной версией «новым дополнением». К тому времени, когда этот ответ был опубликован в сентябре прошлого года, это было хорошо установлено.
 01 нояб. 2012 г., 03:46
@ Andrew OK, это новое дополнение от MSDN: «Visual C # 2010 вводит именованные и необязательные аргументы».
 01 нояб. 2012 г., 03:31
C # не имеет аргументов по умолчанию AFAIK.
 01 нояб. 2012 г., 03:32
@xiaomao Вы не правы. Я использую их все время. Кстати, они называются «Необязательные аргументы».


Вы можете использовать WordGenerator или LoremIpsumGenerator из пакета nuget MMLib.RapidPrototyping.

using MMLib.RapidPrototyping.Generators;
public void WordGeneratorExample()
{
   WordGenerator generator = new WordGenerator();
   var randomWord = generator.Next();

   Console.WriteLine(randomWord);
} 

Nuget site
Сайт проекта Codeplex

которая, как мне кажется, немного быстрее и короче:

private static Random random = new Random();

private string RandomString(int size) {
    StringBuilder builder = new StringBuilder(size);
    for (int i = 0; i < size; i++)
        builder.Append((char)random.Next(0x41, 0x5A));
    return builder.ToString();
}

Обратите внимание, что я не использовал все умножение,Math.floor(), Convert и т.п.

РЕДАКТИРОВАТЬ:random.Next(0x41, 0x5A) можно изменить на любой диапазон символов Unicode.

 01 нояб. 2012 г., 03:30
psst ... вы на самом деле не ответили наproblem ОП был ...
 01 нояб. 2012 г., 03:52
Ваш код делает. Ваше описание не упоминает об этом, хотя. Что касается оптимизации; Я хотел бы увидеть некоторые критерии, прежде чем согласиться с этим утверждением; что-то происходит, о чем вы (очевидно) не знаете. Как и неявные преобразования. Кроме того, вы упустили потенциально самое большое повышение производительности - указав начальный размер для StringBuilder. (ПО МОЕМУ МНЕНИЮ)
 01 нояб. 2012 г., 03:48
@ Andrew Это фактически решает проблему, обратите внимание, что это также оптимизация, которую я сделал для принятого ответа.
 01 нояб. 2012 г., 03:55
@ Андрей, я изменю свой ответ, чтобы отразить это, но с генерацией, равномерно распределенной с помощью метода, предоставленного .NET, вместо пользовательского метода, включающего умножение и операцию пола, должно быть быстрее.

RandomString() метод для генерации случайной строки.

private static readonly Random _rand = new Random();

/// <summary>
/// Generate a random string.
/// </summary>
/// <param name="length">The length of random string. The minimum length is 3.</param>
/// <returns>The random string.</returns>
public string RandomString(int length)
{
    length = Math.Max(length, 3);

    byte[] bytes = new byte[length];
    _rand.NextBytes(bytes);
    return Convert.ToBase64String(bytes).Substring(0, length);
}

оля.

private static Random random = new Random();

private static string CreateTempPass(int size)
        {
            var pass = new StringBuilder();
            for (var i=0; i < size; i++)
            {
                var binary = random.Next(0,2);
                switch (binary)
                {
                    case 0:
                    var ch = (Convert.ToChar(Convert.ToInt32(Math.Floor(26*random.NextDouble() + 65))));
                        pass.Append(ch);
                        break;
                    case 1:
                        var num = random.Next(1, 10);
                        pass.Append(num);
                        break;
                }
            }
            return pass.ToString();
        }
 30 дек. 2011 г., 21:37
@GregBeech действительно? Снова? Скучно много?
 14 окт. 2010 г., 20:29
Обратите внимание, что члены экземпляра класса Random НЕ документированы как поточно-ориентированные, поэтому, если этот метод вызывается из нескольких потоков одновременно (весьма вероятно, например, если вы создаете веб-приложение), то поведение этого код будет неопределенным. Вам нужно либо использовать случайную блокировку, либо сделать ее для каждого потока.

At least one lower case. At least one upper case. At least one decimal. At least one special character.

Вот мой код:

    private string CreatePassword(int len)
    {
        string[] valid = { "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "1234567890", "[email protected]#$%^&*()_+" };
        RNGCryptoServiceProvider rndGen = new RNGCryptoServiceProvider();

        byte[] random = new byte[len];
        int[] selected = new int[len];

        do
        {
            rndGen.GetNonZeroBytes(random);

            for (int i = 0; i < random.Length; i++)
            {
                selected[i] = random[i] % 4;
            }
        } 
        while(selected.Distinct().Count() != 4);

        rndGen.GetNonZeroBytes(random);

        string res = "";

        for(int i = 0; i<len; i++)
        {
            res += valid[selected[i]][random[i] % valid[selected[i]].Length];
        }
        return res;
    }

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

Таким образом, несколько пользователей, одновременно обращающихся к вашему веб-приложению, не получают одинаковые случайные строки.

Здесь есть 3 примера: http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx

Я бы использовал последний:

public static class RandomGen3
{
    private static RNGCryptoServiceProvider _global = 
        new RNGCryptoServiceProvider();
    [ThreadStatic]
    private static Random _local;

    public static int Next()
    {
        Random inst = _local;
        if (inst == null)
        {
            byte[] buffer = new byte[4];
            _global.GetBytes(buffer);
            _local = inst = new Random(
                BitConverter.ToInt32(buffer, 0));
        }
        return inst.Next();
    }
}

Тогда вы можете правильно устранить

Random random = new Random();

И просто вызовите RandomGen3.Next (), пока ваш метод может оставаться статическим.

вы также можете использовать библиотеку System.Web.Security.Membership.GeneratePasswordОднако он будет включать специальные символы.

Чтобы получить 4 случайных символа с минимум 0 специальных символов-

Membership.GeneratePassword(4, 0)
 12 июн. 2012 г., 08:05
Спасибо keithl8041, обновленный ответ, чтобы отразить это.
 22 февр. 2013 г., 23:09
Для меня это правильный ответ, если у вас есть доступ к членству. Я имею в виду, зачем изобретать горячую воду правильно?
 19 авг. 2011 г., 13:01
Обратите внимание, что в 4.0 второй целочисленный параметр обозначаетminimum количество не-альфа-числовых символов для использования. ТакMembership.GeneratePassword(10, 0); не будет работать так, как вы думаете, он по-прежнему будет содержать множество не буквенно-цифровых символов, например:z9sge)?pmV
 17 апр. 2012 г., 15:32
единственная причина, по которой я не хочу использовать это по сравнению с другими методами, заключается в том, что вам приходится сталкиваться с трудностями, связанными с удалением специальных символов ....... при условии, что вам нужно то, чего я не хочу

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

static string
    numbers = "0123456789",
    letters = "abcdefghijklmnopqrstvwxyz",
    lettersUp = letters.ToUpper(),
    codeAll = numbers + letters + lettersUp;

static Random m_rand = new Random();

public static string GenerateCode(this int size)
{
    return size.GenerateCode(CodeGeneratorType.All);
}

public static string GenerateCode(this int size, CodeGeneratorType type)
{
    string source;

    if (type == CodeGeneratorType.All)
    {
        source = codeAll;
    }
    else
    {
        StringBuilder sourceBuilder = new StringBuilder();
        if ((type & CodeGeneratorType.Letters) == CodeGeneratorType.Numbers)
            sourceBuilder.Append(numbers);
        if ((type & CodeGeneratorType.Letters) == CodeGeneratorType.Letters)
            sourceBuilder.Append(letters);
        if ((type & CodeGeneratorType.Letters) == CodeGeneratorType.LettersUpperCase)
            sourceBuilder.Append(lettersUp);

        source = sourceBuilder.ToString();
    }

    return size.GenerateCode(source);
}

public static string GenerateCode(this int size, string source)
{
    StringBuilder code = new StringBuilder();
    int maxIndex = source.Length-1;
    for (int i = 0; i < size; i++)
    {

        code.Append(source[Convert.ToInt32(Math.Round(m_rand.NextDouble() * maxIndex))]);
    }

    return code.ToString();
}

public enum CodeGeneratorType { Numbers = 1, Letters = 2, LettersUpperCase = 4, All = 16 };

Надеюсь это поможет.

Решение Вопроса

который заставляет его возвращать те же значения при вызове в быстрой последовательности. Я бы сделал что-то вроде этого:

private static Random random = new Random((int)DateTime.Now.Ticks);//thanks to McAden
private string RandomString(int size)
    {
        StringBuilder builder = new StringBuilder();
        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();
    }

// get 1st random string 
string Rand1 = RandomString(4);

// get 2nd random string 
string Rand2 = RandomString(4);

// creat full rand string
string docNum = Rand1 + "-" + Rand2;

(модифицированная версия вашего кода)

 14 окт. 2010 г., 20:27
Обратите внимание, что экземпляры членовRandom Класс НЕ документирован как поточно-ориентированный, поэтому, если этот метод вызывается из нескольких потоков одновременно (весьма вероятно, например, если вы создаете веб-приложение), поведение этого кода будет неопределенным. Вам нужно либо использовать случайную блокировку, либо сделать ее для каждого потока.
 PushCode14 июл. 2009 г., 01:09
Спасибо RCIX, я пошел с твоим примером, и он работает!
 14 июл. 2009 г., 01:42
Добро пожаловать! я не думаю, что вы не против принять этот ответ ... :)
 30 мая 2013 г., 15:49
@NickFreeman: Помниthe upper bound is exclusive, такch = (char)random.Next('A','Z'); никогда не вернется'Z', Так что вам нужноch = (char)random.Next('A', 'Z' + 1); включить'Z'.
 11 апр. 2013 г., 16:43
Кроме того, вы можете получить случайную заглавную букву, используяch = (char)random.Next('A','Z'); намного проще, чем нечитаемая строкаch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); из оригинального поста. Затем, если вы хотите переключить его в нижний регистр, вы можете легко переключиться на(char)random.Next('a','z');

Random учебный класс.

Usage
class Program
{
    private static Random random = new Random(); 

    static void Main(string[] args)
    {
        random.NextString(10); // "cH*%I\fUWH0"
        random.NextString(10); // "Cw&N%27+EM"
        random.NextString(10); // "0LZ}nEJ}_-"
        random.NextString();   // "kFmeget80LZ}nEJ}_-"
    }
}
Implementation
public static class RandomEx
{
    /// <summary>
    /// Generates random string of printable ASCII symbols of a given length
    /// </summary>
    /// <param name="r">instance of the Random class</param>
    /// <param name="length">length of a random string</param>
    /// <returns>Random string of a given length</returns>
    public static string NextString(this Random r, int length)
    {
        var data = new byte[length];
        for (int i = 0; i < data.Length; i++)
        {
            // All ASCII symbols: printable and non-printable
            // data[i] = (byte)r.Next(0, 128);
            // Only printable ASCII
            data[i] = (byte)r.Next(32, 127);
        }
        var encoding = new ASCIIEncoding();
        return encoding.GetString(data);
    }

    /// <summary>
    /// Generates random string of printable ASCII symbols
    /// with random length of 10 to 20 chars
    /// </summary>
    /// <param name="r">instance of the Random class</param>
    /// <returns>Random string of a random length between 10 and 20 chars</returns>
    public static string NextString(this Random r)
    {
        int length  = r.Next(10, 21);
        return NextString(r, length);
    }
}
 06 нояб. 2012 г., 12:27
Я добавил диапазон только для печатных символов. Вам нужно будет прокомментировать одну строку и раскомментировать другую. Благодарю.
 05 нояб. 2012 г., 23:25
Вы вытаскиваете из всего набора ascii, включая непечатные символы?

вы можете генерировать реальные случайные числа и строки, используя следующие библиотеки:https://github.com/JebteK/RdRand а такжеhttps://www.rdrand.com/

Просто скачайте последнюю версию сВот, включите Jebtek.RdRand и добавьте оператор использования для него. Затем все, что вам нужно сделать, это:

bool isAvailable = RdRandom.GeneratorAvailable(); //Check to see if this is a compatible CPU
string key = RdRandom.GenerateKey(10); //Generate 10 random characters

Кроме того, вы также получаете эти дополнительные возможности:

string apiKey = RdRandom.GenerateAPIKey(); //Generate 64 random characters, useful for API keys
byte[] b = RdRandom.GenerateBytes(10); //Generate an array of 10 random bytes
uint i = RdRandom.GenerateUnsignedInt() //Generate a random unsigned int

Если у вас нет совместимого процессора для выполнения кода, просто воспользуйтесь сервисами RESTful на rdrand.com. С библиотекой оболочки RdRandom, включенной в ваш проект, вам просто нужно сделать это (вы получаете 1000 бесплатных звонков при регистрации):

string ret = Randomizer.GenerateKey(<length>, "<key>");

Вы также можете генерировать случайные байтовые массивы и целые числа без знака следующим образом:

uint ret = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");

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

Для генератора случайных строк:

#region CREATE RANDOM STRING WORD
        char[] wrandom = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','X','W','Y','Z'};
        Random random = new Random();
        string random_string = "";
        int count = 12; //YOU WILL SPECIFY HOW MANY CHARACTER WILL BE GENERATE
        for (int i = 0; i < count; i++ )
        {
            random_string = random_string + wrandom[random.Next(0, 24)].ToString(); 
        }
        MessageBox.Show(random_string);
        #endregion

// Очень простая реализация

using System..GetRandomFileName();
    rStr = rStr.Replace(".", ""); // For Removing the .
    return rStr;
}

// Теперь просто вызываем метод RandomStr ()

 24 янв. 2012 г., 13:54
@AndersFjeldstad Согласен, я сделал цикл, и он столкнулся со столкновением примерно после 130 000 итераций. Хотя существует 1 785 793 904 896 комбинаций.
 20 апр. 2011 г., 11:23
отлично! Мне нравится, когда вы находите маленький драгоценный камень, такой как GetRandomFileName, скрытый в .Net Framework
 24 июл. 2012 г., 23:51
Это создает файлы на диске. Из MSDN: метод GetTempFileName вызовет IOException, если он используется для создания более 65535 файлов без удаления предыдущих временных файлов. Метод GetTempFileName вызовет IOException, если уникальное временное имя файла недоступно. Чтобы устранить эту ошибку, удалите все ненужные временные файлы.
 07 нояб. 2012 г., 03:27
@bugnuker & quot; Метод GetRandomFileName возвращает криптографически сильную случайную строку, которая может использоваться либо как имя папки, либо как имя файла. В отличие от GetTempFileName, GetRandomFileName не создает файл. Если безопасность вашей файловой системы имеет первостепенное значение, этот метод следует использовать вместо GetTempFileName. & Quot; Мы говорим о GetRandomFileName (), а не GetTempFileName ().
 13 янв. 2012 г., 17:53
Использовал твой с небольшим редактированием. guid = Guid.NewGuid (); mystring = guid.ToString (); mystring = mystring.Replace (& quot; - & quot ;, & quot; & quot;); mystring = mystring.Substring (0, 8);

Ваш ответ на вопрос