Шарпы, рандомы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CodeSender:), 16 Jan 2011.

  1. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Собсна помогите придумать быструю, потокобезопасную функцию генерации рандомной строки по заданной маске.Например я ввожу "qwertyuiop12345" и он генерирует строку только с этими символами.Также было бы неплохо добавить рандомный регистр чтоб выходило что-то типа "S9Hdu9DSdg".

    P.S На данный момент имеется вот такой высер:
    PHP:
            public static string RandomName()
            {
                
    Random random = new Random();
                
    int maxSize random.Next(510); //Длина рандома (от - до)

                
    char[] chars = new char[62];
                
    chars "abcdefg1234567".ToCharArray(); //Символы которые будут применены в рандоме.
                
    byte[] data = new byte[1];
                
    RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
                
    crypto.GetNonZeroBytes(data);
                
    data = new byte[maxSize];
                
    crypto.GetNonZeroBytes(data);
                
    StringBuilder result = new StringBuilder(maxSize);
                foreach (
    byte b in data)
                {
                    
    result.Append(chars[% (chars.Length 1)]);
                }
                return 
    result.ToString();
            }
     
    #1 CodeSender:), 16 Jan 2011
    Last edited: 16 Jan 2011
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Волшебство системы Windows на Си
    Code:
    BOOL (__stdcall *SystemFunction036)(PVOID RandomBuffer, ULONG RandomBufferLength);  
    BYTE random[512];
    
    SystemFunction036=(BOOL (__stdcall *)(PVOID, ULONG))GetProcAddress(GetModuleHandle("Advapi32.dll"), "SystemFunction036");
    SystemFunction036(random,sizeof(random));
    
    Ну а по маске, не знаю :) Пройдись по буферу и скопируй нужные символы в новый массив
     
    _________________________
  3. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    PHP:
            public static string RandomString()
            {
                
    int maxsize random.Next(510);
                
    char[] mask "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();

                
    StringBuilder sb = new StringBuilder();
                for (
    int i 0maxsizei++)
                    
    sb.Append(mask[random.Next(random.Next(11000000)) % (mask.Length 1)]);

                return 
    sb.ToString();
            }
    Вот ещё такое с потцанчиком надумали, но ресурсоёмко слишком имхо...
     
  4. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Я использую последний вариант, правда, без маски.

    Код можно слегка улучшить так:
    Code:
    StringBuilder sb = new StringBuilder(maxsize); 
    
    for (int i = 0; i < maxsize; i++) 
    {
        sb[i] = mask[random.Next(0, mask.Length)];
    }
    И ещё. Ёмкость StringBuilder'а по умолчанию равна 16.
     
    #4 X-rus, 17 Jan 2011
    Last edited: 17 Jan 2011
  5. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    иле так

    PHP:
            public static string RandomString(string randomizeAlphabetint lengthString)
            {
                
    StringBuilder result = new StringBuilder();

                for (
    int i 0lengthStringi++)
                    
    result.Append(randomizeAlphabet[random.Next(randomizeAlphabet.Length)]);

                return 
    result.ToString();
            }