gpt4 book ai didi

c - PRNG 在所有进程中返回相同的值

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:08 24 4
gpt4 key购买 nike

下面的代码(并且可以按原样编译)导致随机数生成器出于某种原因为所有进程返回完全相同的随机数。怎么可能呢?我对互斥体做错了吗?

#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define RETURN_FAILURE_IF_TRUE(condition, ...) \
{ \
if(condition) \
{ \
fprintf(stderr, __VA_ARGS__); \
return EXIT_FAILURE; \
} \
}

#define RETURN_FAILURE_IF_FALSE(condition, ...) \
RETURN_FAILURE_IF_TRUE(!(condition), __VA_ARGS__)

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int nextRandomDouble(double* d)
{
if(pthread_mutex_lock(&mutex) != 0) return 0;
*d = drand48();
if(pthread_mutex_unlock(&mutex) != 0) return 0;
return 1;
}

int main()
{
const int processes = 5;
srand48(time(NULL));

for(int i = 0; i < processes; ++i)
{
pid_t pid = fork();
RETURN_FAILURE_IF_TRUE(pid < 0, "Fork failed.\n");
if(pid == 0)
{
double d;
RETURN_FAILURE_IF_FALSE(nextRandomDouble(&d), "PRNG failed.\n");
printf("rnd: %f\n", d);
return EXIT_SUCCESS;
}
}

for(int i = 0; i < processes; ++i)
{
int status;
pid_t pid = waitpid(-1, &status, 0);
RETURN_FAILURE_IF_TRUE(
(pid != 1) && (status != 0), "Child exit failed.\n"
);
}
return EXIT_SUCCESS;
}

最佳答案

srand48(time(NULL));

您在每个进程中为 PRNG 播种从进程开始到秒的时间。这意味着在同一个第二个开始的所有进程都为具有相同值的 PRNG 播种。

尝试:

srand48((getpid()*2654435761U)^time(NULL));

关于c - PRNG 在所有进程中返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056371/

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