Если вы хотите получить выходные данные, зависящие от времени выполнения, с rand()
, вы должны настроить его в зависимости от среды выполнения.
Как предлагается в комментарии, простой способ - вызвать srand(time(NULL))
один раз перед num
-loop:
DEMO .
srand(time(NULL));
for (int i = 0; i < num; ++i)
{
for (int j = 0; j < length; ++j) {
Str += randGen();
}
std::cout << Str << std::endl;
}
Хотя rand()
обычно должен быть реализован как Park-Miller LCG,
но, например, как отмечено в проекте стандарта C ++ n4687, алгоритм, используемый в rand()
, полностью определен реализацией компилятора :
29.6.9 Генерация случайных чисел низкого качества [c.math.rand]
int rand();
void srand(unsigned int seed);
Базовый алгоритм
... rand не указан. Поэтому использование rand по-прежнему непереносимо, с непредсказуемым и часто сомнительным качеством и производительностью.
К счастью, в C ++ 11 и более поздних версиях мы можем использовать <random>
для генерации гарантированной случайности качества.
Поэтому я рекомендую вам использовать их следующим образом.
Если вам нужна более качественная случайность, вы можете использовать std::mt19937
вместо std::minstd_rand
:
DEMO
#include <random>
static constexpr char combination[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
constexpr int stringLength = sizeof(combination) - 1;
std::minstd_rand gen(std::random_device{}());
std::uniform_int_distribution<std::size_t> dis(0, stringLength-1);
char randGen() {
return combination[dis(gen)];
}