그래서 C로 일부 응용 프로그램을 작성하고 OpenMP를 사용하여 병렬 처리를 수행했습니다. 몬테카를로 파이 추정치를 구현했는데 정상적인 rand() 함수는 재진입 및 스레드 안전성이 없다는 것을 알았습니다. 권장 사항은 drand48_r 옵션을 사용하는 것입니다.C에서 난수 생성기로 drand48_r 사용
이제 문제가 생겼습니다. 예를 들어, 제 응용 프로그램이 Linux에서 정상적으로 컴파일됩니다. 우분투, 페도라와 CentOS하지만 맥 OS X에서 컴파일되지 않습니다. OS X에서 컴파일 오류가 발생했습니다.
simple.c:7: error: storage size of ‘randBuffer’ isn’t known
간단한 예제로 사용 된 코드는 다음과 같습니다
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
double x;
struct drand48_data randBuffer;
srand48_r(time(NULL), &randBuffer);
drand48_r(&randBuffer, &x);
printf("Random number: %f\n", x);
return EXIT_SUCCESS;
}
내가 그것에 대해 읽어 내가 여기
이 링크입니다, 그 사람이 페이지에 메모를 발견 그것 : http://www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.htmlThese functions are GNU extensions and are not portable.
나는 많은 질문이있다;
- GNU 확장은 무엇이며 이식성을 없게 만드는 요인은 무엇입니까?
- 스레드로부터 안전한 OS X에서 난수 생성을 위해 어떤 대안을 사용할 수 있습니까?
글쎄요.
예는
gcc simple.c -o simple
랜덤 시드로'time()'을 사용하는 것은 매우 임의적이지 않습니다. 이것은 응용 프로그램에서는 중요하지 않지만 두 프로세스가 같은 초에 실행될 경우 동일한 시드 (시간)를 사용하기 때문에 동일한 난수 시퀀스를 얻게됩니다. –
예 일반적으로 SEED 값을 스레드 ID와 결합합니다. 이 예제에서 나는 단순화를 위해 OpenMP 코드를 생략했다. – pfdevilliers