Как создать хорошее случайное семя для передачи в srand ()? - PullRequest
6 голосов
/ 02 февраля 2010

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

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

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

Ответы [ 7 ]

24 голосов
/ 02 февраля 2010

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

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

В Windows его называют GetTempFileName() и GetTempPath().

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

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

2 голосов
/ 02 февраля 2010

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

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 одновременно, могут вызвать проблемы.

1 голос
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...