gpt4 book ai didi

c - MPI、C - 无法正确生成随机数

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:58 26 4
gpt4 key购买 nike

您好,我是 Stackoverflow 的新手。
我在 C 中使用 MPI。我正在运行 10 个进程。

我的每个进程都包含一个随机数生成器,它为该进程唯一地生成一个随机数(0 或 1)。

但是,当我运行我的代码时,我发现具有偶数等级(例如等级 0 或等级 2 或等级 4)的进程仅分配了随机数 0。只有 0。
同时,具有奇数等级(例如等级 1 或等级 3 或等级 4)的进程仅分配随机数 1。

如何修改我的代码,以便可以为一些偶数进程分配随机数 1,而一些奇数进程可以分配随机数 0?

这是我的代码:

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
// Initialize the MPI environment
MPI_Init(NULL, NULL);

// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);

// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

//try to generate unique random number
srand(time(NULL)+world_rank);
int rando = rand()%2;
// Print off rank with random number
printf("Rank %d has the random value %d\n", world_rank, rando);

// Finalize the MPI environment.
MPI_Finalize();
}

这是我的输出:

Rank 0 has the random value 0
Rank 7 has the random value 1
Rank 8 has the random value 0
Rank 9 has the random value 1
Rank 1 has the random value 1
Rank 2 has the random value 0
Rank 4 has the random value 0
Rank 3 has the random value 1
Rank 5 has the random value 1
Rank 6 has the random value 0

谢谢

最佳答案

核心问题是time(NULL)+world_rank

这些组合得好吗?


当然,根据定义,所有偶数进程的 world_rank 最低有效位为 0,奇数为 1。

对于一天中的给定时间(以秒为单位),如果大约在同一时间启动,则 time() 的值对于进程的每次启动可能是相同的。

我们可以合理确定 time() 的属性:它增加,每秒都一样。

我们不知道进程标识符与时间无关。


第一步是报告时间进程 ID

time_t t = time(NULL);
printf("time() %lld\n", (long long) t);
printf("process %d\n", world_rank);

接下来,以比+ 更好的方式组合时间进程ID。让我们散列 world_rankt 以确保值不是无关紧要的。

示例:琐碎的 Linear congruential generator

const unsigned m = 1664525u;
const unsigned c = 1013904223u;
unsigned t_hashed = (unsigned) t;
t_hashed = m*t_hashed + c;

现在合并:

srand(t_hashed ^ world_rank);

如果这不能提供令人满意的结果,请使用其他来源的数字 entropy需要。

关于c - MPI、C - 无法正确生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com