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