Как вы генерируете случайные строки в C ++? - PullRequest
12 голосов
/ 27 января 2010

Я ищу методы для генерации случайных строк в C ++. Вот мой код:

string randomStrGen(int length) {
    static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    string result;
    result.resize(length);

    srand(time(NULL));
    for (int i = 0; i < length; i++)
        result[i] = charset[rand() % charset.length()];

    return result;
}

Но seed(time(NULL)) не является достаточно случайным. Есть ли другой лучший способ генерировать случайные строки в C ++?

Ответы [ 6 ]

25 голосов
/ 27 января 2010

Не вызывайте srand() при каждом вызове функции - вызывайте его только один раз при первом вызове функции или запуске программы. Возможно, вы хотите иметь флаг, указывающий, был ли уже вызван srand().

Метод sugested хорош, за исключением того, что вы неправильно используете srand() и получаете предсказуемо плохие результаты.

1 голос
/ 27 января 2010

Создайте интерфейс для получения случайного числа на этом сайте http://www.random.org/ и вы обязательно получите реальное случайное число! Но если вы ищете производительность ...

1 голос
/ 27 января 2010

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

В частности, большинство стандартных библиотек предоставляют линейные конгруэнтные генераторы, которые не очень хорошо работают, когда вы mod получаете их результаты с небольшими числами. Boost.Random имеет твистер-генератор Mersenne.

Однако, как говорит острый зуб (хорошее обнаружение!), Только запустите генератор один раз, в самом начале вашей программы. Посеять его каждый раз, когда вы хотите что-то случайное, неэффективно.

0 голосов
/ 15 августа 2017

используйте std :: generate_n. Таким образом, вы можете указать длину сгенерированной строки. В приведенном ниже случае его 4.

std::string uniqueName() {
    auto randchar = []() -> char
    {
        const char charset[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        const size_t max_index = (sizeof(charset) - 1);
        return charset[ rand() % max_index ];
    };
    std::string str(4,0);
    std::generate_n( str.begin(), 4, randchar );
    return str;
}
0 голосов
/ 17 мая 2014

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

<somewhere else>
srand(NULL);
</somewhere else>

char get_rand_char() {
  static string charset(...);
  return charset[rand() % charset.size()];
}

std::string generate_random_string(size_t n) {
  char rbuf[n];
  std::generate(rbuf, rbuf+n, &get_rand_char);
  return std::string(rbuf, n);
}

Этот код, естественно, более модульный, и администраторы стандартных библиотек, как правило, пишут код лучше меня. Таким образом, я могу изменить часть кода, генерирующую случайные символы, не затрагивая ничего другого. Я мог бы даже перейти к функции, которая случайным образом выбирает генератор случайных чисел! Не то, чтобы это усугубляло случайность или что-нибудь ...

0 голосов
/ 27 января 2010

В системах Unix вы можете прочитать случайные значения из файла /dev/random

...