Как вы генерируете случайные строки в C++?

Я ищу методы для генерации случайных строк в 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 ответов


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

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


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

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

Как говорит sharptooth, хотя (хорошее пятно!), только посеять генератор один раз, в самом начале ваша программа. Засев его каждый раз, когда вы хотите что-то случайное, контрпродуктивно.


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


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


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

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

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


используйте 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;
}