我正在运行
#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;
}
以分配方式生成随机数,然而,它每次都给我一个大小相同的数字....
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$
在网站http://www.boost.org/doc/libs/1_55_0/doc/html/mpi/tutorial.html中,其他人说他们得到了:
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
我很困惑....有什么帮助吗?谢谢。
答案 0 :(得分:3)
You Problem是cstdlib的rand()函数。它不是一个好的随机数发生器。如果你想在c ++中使用适当的随机数,请使用c ++ - 11或外部随机数生成器(例如mersenne twister)中的一些。 但是,在并行程序中使用随机数并非易事。你应该使用专门的随机数生成器(例如r250_omp.h)。
答案 1 :(得分:1)
问题很可能是由rand
造成的。请参阅此问题的讨论和答案:First random number is always smaller than rest
似乎相邻种子(您的情况)生成的数字可能非常相关。兰德的实现可能会有所不同,对于某些实现,它似乎是一个更加明显的现象。
答案 2 :(得分:0)
我认为你的随机数应该是这样的:
int max=100, min=0;
srand(time(NULL));
int random = (rand() % (max-min)) + min;