Подтвердить что ты не робот

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

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

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)) не является случайным достаточно. Есть ли другой лучший способ генерации случайных строк в С++?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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