Как генерировать хорошее случайное семя для передачи srand ()?

Я пишу программу C++, которая должна создать временный файл для его внутреннего использования. Я хотел бы позволить параллельные осуществления программы путем выполнения нескольких процессов, таким образом, временное имя файла должно быть рандомизировано, тот способ, которым каждый порожденный процесс генерирует уникальное временное имя файла для своего собственного использования.

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

Какие опции там для передачи хорошего аргумента к srand () таким образом, что два процесса не будут инициализированы с тем же значением семени? Мой код должен работать и над Windows и над Linux.

6
задан Aquarius_Girl 9 January 2017 в 06:17
поделиться

7 ответов

Вопрос на самом деле спрашивает, как создать временный файл с уникальным именем.

Операционная система, вероятно, предоставляет для этого API, что означает, что вам не нужно создавать собственное имя.

В Windows это называется GetTempFileName () и GetTempPath () .

В Unix используйте tmpfile () .

(Windows также поддерживает tmpfile () ; однако я слышал сообщения от других, что, хотя он хорошо работает в XP, он не работает в Vista, если вы используете диск C: и вы не администратор; лучше всего использовать метод GetTempFileName () с настраиваемым безопасным путем)

24
ответ дан 8 December 2019 в 03:52
поделиться

Если вы просто нуждаетесь в TEMP-файле, вы можете использовать:

FILE* tmpfile();        // Generate an unnamed temporary file.
char* tmpnam(char* s);  // Generate a file name in the director specified by TMPDIR

Время использования:

srand(time(NULL));

также обратите внимание, что Rand (), вероятно, не безопасно для потоков.
Так что будьте осторожны, как вы его используете. Два потока, входящие в RAND одновременно, собираются вызвать проблемы.

2
ответ дан 8 December 2019 в 03:52
поделиться

Я никогда не использовал его сам, но вы сможете использовать TMPNAM () , чтобы создать имя вашего временного файла. Быстрый поиск указал на поддержку как Windows и Linux .

1
ответ дан 8 December 2019 в 03:52
поделиться

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

0
ответ дан 8 December 2019 в 03:52
поделиться

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

0
ответ дан 8 December 2019 в 03:52
поделиться

У разных процессов будут разные идентификаторы процессов. Однако добавлять это прямо к времени было бы немного небрежно, поскольку часто это небольшое число. Однако это не большая проблема: основная проблема заключается в том, что и время, и идентификатор процесса имеют свою энтропию, сконцентрированную в своих младших битах. Просто поменяв местами один бит и выполняя XOR результата, вы получите хорошую энтропию во всех битах.

0
ответ дан 8 December 2019 в 03:52
поделиться

В системах UNIX считайте значение из / dev / random

0
ответ дан 8 December 2019 в 03:52
поделиться