Основная проблема: time(NULL)+world_rank
.
Хорошо ли они объединены?
Все четные процессы, конечно, имеют младший значащий бит world_rank
в виде 0 и нечетногоединицы 1, по определению.
Для заданного времени суток в секундах значение из time()
может быть одинаковым для каждого запуска процесса, если оно началось примерно в одно и то же время.
Мы можем быть достаточно уверены в свойствах time()
: оно увеличивается, оно одинаково каждую секунду.
Мы не знаем, что идентификатор процесса не зависит от time .
Первым шагом было бы сообщить time и ID процесса .
time_t t = time(NULL);
printf("time() %lld\n", (long long) t);
printf("process %d\n", world_rank);
Nextобъедините time и ID процесса в некотором смысле лучше, чем +
.Давайте хешируем world_rank
или t
, чтобы гарантировать, что значения не являются тривиально не связанными.
Пример: тривиальный Линейный конгруэнтный генератор
const unsigned m = 1664525u;
const unsigned c = 1013904223u;
unsigned t_hashed = (unsigned) t;
t_hashed = m*t_hashed + c;
Теперь объединяем:
srand(t_hashed ^ world_rank);
Если это не дает удовлетворительных результатов, необходимы другие источники числовой энтропии .