Как получить случайную строку в С?

Добрый вечер. Есть функции которая генерирует случайную строку. Работает на отлично. Но если запустить ее несколько раз подряд то будем получать одинаковую строку. И я даже понимаю почему так происходит.
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

const char hex_character[2][17] = {"0123456789abcdef","0123456789ABCDEF"};

void hex_random(int salt_len, char *output, int uppercase) {
    int i;
    srand((unsigned)time( NULL ));
    for(i = 0; i < salt_len; i++) {

        output[i] = hex_character[uppercase][rand() % 16];
    }
    output[salt_len] = 0;
}

int main(){

    int rand_len = 32;
    char t1[rand_len + 1];
    char t2[rand_len + 1];

    hex_random(rand_len, t1, 0);
    hex_random(rand_len, t2, 0);

    fprintf(stderr, "%s\n%s\n", t1, t2);

    return 0;
}


Если изменить конструкцию
srand((unsigned)time( NULL ));
На
srand((unsigned)clock());
функция начинает работать как нужно, но везде где я натыкался на такой пример он был заминусован.
Собственно вопрос, как правильно получить рандомную строку и чем последный вариант плох?
Спасибо!
  • Вопрос задан
  • 458 просмотров
Решения вопроса 1
@Eddy_Em
Ну так не надо же второй раз srand запускать!
Ясен пень, функция time секунды возвращает.

Могу привести несколько вариантов инициализации ГСЧ, в т.ч. по /dev/random и /dev/urandom, но в конкретном примере за глаза хватит srand(time(NULL)), выполненной в начале main().

Вот и по-быстренькому у себя пример нашел: srand48 запускается с аргументом, значение которого читается из /dev/random (кстати, здесь я переборщил: на самом деле, как показали исследования, всегда можно вместо /dev/random использовать /dev/urandom, т.к. фактически никакой разницы не будет). Если же в системе по какой-то причине нет /dev/random (ну, я такую причину придумать не смог: разве что админ будет приколистом и запретит рядовым юзерам оттуда читать), то соль берется из значения текущего времени (но уже с более высоким разрешением).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
Плох вариант с clock() предсказуемостью сида, но если вам не для серьезного использования - более чем подойдет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы