Генерация случайных чисел, которая допускает некоторое повторение в заданном диапазоне - PullRequest
0 голосов
/ 28 сентября 2018

Я пишу программу MPI, где я позволяю каждому процессу генерировать свое собственное случайное число в течение прошедшего времени, когда я бы хотел, чтобы какой-то процесс имелидентичные случайные числа , сгенерированные каким-то другим процессом. Например, простой оператор printf:

Process 1 has generated the number 19
Process 2 has generated the number 8
Process 3 has generated the number 19
.
.

Следовательно, процессы 1 и 3 сгенерировали одно и то же случайное число.Кроме того, чтобы гарантировать, что я могу получить идентичное сгенерированное случайное число, я ограничусь только целочисленными значениями, а не значениями типа double или float.

Я написал:

#include <stdio.h>
#include "mpi.h"
#include <stdlib.h>
#include <time.h>
#define numprocess 20

int main(int argc, char *argv[])
{
    int rank,size;
    int rand_value;
    int lower,upper;

    MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);

    upper = 20;
    lower = 0;
    rand_value = rand()%(upper-lower);
    printf("Process %d generated a random number of %d\n",rank,rand_value);

    MPI_Finalize();
    return 0;
}

, но яполучить вывод:

Process 0 generated a random number of 7
Process 2 generated a random number of 7
Process 8 generated a random number of 7
Process 1 generated a random number of 7
Process 3 generated a random number of 7
Process 4 generated a random number of 7
Process 5 generated a random number of 7
Process 6 generated a random number of 7
Process 7 generated a random number of 7
Process 9 generated a random number of 7
Process 11 generated a random number of 7
Process 10 generated a random number of 7
Process 16 generated a random number of 7
Process 17 generated a random number of 7
Process 19 generated a random number of 7
Process 13 generated a random number of 7
Process 12 generated a random number of 7
Process 18 generated a random number of 7
Process 15 generated a random number of 7
Process 14 generated a random number of 7

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете сделать так:

srand(time(NULL)+rank * 10000);

Использование time обеспечит получение разных выходных данных при каждом запуске, а использование rank гарантирует (с высокой вероятностью, но не 100%)что каждая нить имеет разные семена.Константа 10000 является произвольной константой только для уменьшения вероятности того, что два потока случайно получат одинаковое начальное число.

Но это гораздо лучший метод:

const int current_time = time(NULL);

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);

srand(current_time+rank);

Или с использованием MPI_Bcast

int current_time;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);

if(rank == 0)
    current_time = time(NULL);

MPI_Bcast(&current_time, 1, MPI_INT, 0, MPI_COMM_WORLD);
srand(current_time+rank);
...