My C ++ random number is not random

I run this

#include <boost/mpi.hpp>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
namespace mpi = boost::mpi;

int main()
{
    mpi::environment env;
    mpi::communicator world;



    srand (time(NULL));
    std::srand(time(0) + world.rank());
    int my_number = std::rand();
    if (world.rank() == 0) {
        std::vector<int> all_numbers;
        gather(world, my_number, all_numbers, 0);
        for (int proc = 0; proc < world.size(); ++proc)
            std::cout << "Process #" << proc << " thought of "
            << all_numbers[proc] << std::endl;
    } else {
        gather(world, my_number, 0);
    }

    return 0;
}

      

to distribute an arbitrary number, however it gives me a number around the same magnitude every time ...

dhcp-18-189-66-216:ising2 myname$ make
mpic++ -I/usr/local/include/boost -L/usr/local/lib -lboost_mpi -lboost_serialization main.cpp -o main
mpirun -n 4 main
Process #0 thought of 238772362
Process #1 thought of 238789169
Process #2 thought of 238805976
Process #3 thought of 238822783
dhcp-18-189-66-216:ising2 myname$ make
mpic++ -I/usr/local/include/boost -L/usr/local/lib -lboost_mpi -lboost_serialization main.cpp -o main
mpirun -n 4 main
Process #0 thought of 238805976
Process #1 thought of 238822783
Process #2 thought of 238839590
Process #3 thought of 238856397
dhcp-18-189-66-216:ising2 myname$ make
mpic++ -I/usr/local/include/boost -L/usr/local/lib -lboost_mpi -lboost_serialization main.cpp -o main
mpirun -n 4 main
Process #0 thought of 238856397
Process #1 thought of 238873204
Process #2 thought of 238890011
Process #3 thought of 238906818
dhcp-18-189-66-216:ising2 myname$ 

      

On the website http://www.boost.org/doc/libs/1_55_0/doc/html/mpi/tutorial.html, others said they got:

Process #0 thought of 332199874
Process #1 thought of 20145617
Process #2 thought of 1862420122
Process #3 thought of 480422940
Process #4 thought of 1253380219
Process #5 thought of 949458815
Process #6 thought of 650073868

      

I am very confused .... Any help? Thank.

+3


source to share


3 answers


You are the problem - the rand () function of cstdlib. This is not a good random number generator. If you want to use correct random numbers in C ++, use some of the headers from C ++ - 11 or external random number generators (like mersenne twister). Nevertheless, using random numbers for parallel programs is not an easy task. You should use random number generators that specialize in this (e.g. r250_omp.h).



+3


source


The problem will most likely be caused by yours rand

. See discussion and answers to this question: First random number is always less than rest



It seems that the generated numbers for neighboring seeds (your case) can be quite highly correlated. the implementation of rand can vary, and for some implementations it seems much more pronounced.

+1


source


I think your random gen should be like this:

int max=100, min=0;
srand(time(NULL));
int random = (rand() % (max-min)) + min;

      

0


source







All Articles