C ++ одинаковые значения генерируются случайным образом с двумя циклами for - PullRequest
0 голосов
/ 12 января 2019

Так что я работаю над этим для цикла (ов) здесь:

    for (int i = 0; i < num; i++) {
        for (int i = 0; i < length; i++) {
            Str += randGen();
        }
        cout << Str << endl;
    }
}

А для контекста целое число "длина" - это случайно сгенерированный размер строки. Вот моя функция randGen ():

static const char combination[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(combination) - 1;

char randGen() {

    return combination[rand() % stringLength];
}

По сути, моя проблема в том, что если 'num' больше единицы, он будет распечатывать начальную случайно сгенерированную часть для каждой из них одинаково, и она не изменится. Единственный случай, когда появляются новые случайно сгенерированные символы, это когда размер «длины» увеличивается, и это все. Однако я хочу, чтобы все СПО были совершенно разными. Кто-нибудь может мне помочь?

- спасибо заранее -

1 Ответ

0 голосов
/ 12 января 2019

Если вы хотите получить выходные данные, зависящие от времени выполнения, с 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)];
}
...