【问题标题】:Generating random numbers which allows some repetition within a given range生成允许在给定范围内重复的随机数
【发布时间】:2019-03-04 10:13:03
【问题描述】:

我正在编写一个 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 生成了相同的随机数。此外,为了确保我可以获得相同的随机数生成,我将限制为仅整数值,而不是双精度或浮点数。

我写过:

#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

【问题讨论】:

  • rand() 产生一个伪随机数。考虑将std::random_device 用于真正的随机数。
  • 什么是value,它在哪里初始化?
  • 我不知道 MPI 是什么意思,但你不是忘了打电话给srand() 吗?
  • 如果您在 Un*x 上,请尝试阅读 /dev/urandom
  • 使用 MPI 等级来播种 RNG。 rank%2 看起来很合适。

标签: c mpi


【解决方案1】:

你可以这样做:

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);

【讨论】:

  • @Broman 谢谢,但我很困惑。第二段,使用 MPI_Bcast 不需要 srand(current_time + rank)?
  • @Broman 另外,如果我要设置随机数的下限和上限范围,我是否通过 srand(current_time+rank) % (upper-lower) 来实现它,作为模差异似乎以某种方式起作用?
  • @Broman 实际上,目标是确保某些进程最终生成相同随机数的可能性。换句话说,在第一次运行时,所有 20 个进程可能偶然具有所有不同的随机数。在第二次运行时,可能有 3 或 4 个进程共享相同的随机数,依此类推。
  • @troopers97 是的,你需要 srand。我已经更正了帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多