두 가지 - 먼저 예제가 Fortran에 있지만 모든 언어에 대해 보유해야한다고 생각합니다. 두 번째로, 내장 된 난수 생성기는 실제로 무작위가 아니며 다른 생성기가 있지만 우리가하는 일에 사용하는 데 관심이 없습니다.난수 시드의 가능한 소스
랜덤 시드에 대한 대부분의 논의는 프로그램이 런타임에 시드하지 않으면 컴파일 타임에 시드가 생성된다는 것을 인정합니다. 따라서 프로그램을 실행할 때마다 동일한 순서의 숫자가 생성되기 때문에 임의의 숫자에는 적합하지 않습니다. 이것을 극복하는 한 가지 방법은 난수 생성기에 시스템 클럭을 뿌리기위한 것입니다.
그러나 멀티 코어 시스템에서 MPI와 병렬로 실행하면 시스템 클럭 방식으로 동일한 종류의 문제가 발생합니다. 시퀀스가 실행에서 실행으로 변경되는 동안 모든 프로세서는 동일한 시스템 클록을 가지므로 동일한 임의 시드와 동일한 시퀀스를 갖습니다.
PROGRAM clock_test
IMPLICIT NONE
INCLUDE "mpif.h"
INTEGER :: ierr, rank, clock, i, n, method
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
REAL(KIND=8) :: random
INTEGER, PARAMETER :: OLD_METHOD = 0, &
NEW_METHOD = 1
CALL MPI_INIT(ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
CALL RANDOM_SEED(SIZE=n)
ALLOCATE(seed(n))
DO method = 0, 1
SELECT CASE (method)
CASE (OLD_METHOD)
CALL SYSTEM_CLOCK(COUNT=clock)
seed = clock + 37 * (/ (i - 1, i = 1, n) /)
CALL RANDOM_SEED(put=seed)
CALL RANDOM_NUMBER(random)
WRITE(*,*) "OLD Rank, dev = ", rank, random
CASE (NEW_METHOD)
OPEN(89,FILE='/dev/urandom',ACCESS='stream',FORM='UNFORMATTED')
READ(89) seed
CLOSE(89)
CALL RANDOM_SEED(put=seed)
CALL RANDOM_NUMBER(random)
WRITE(*,*) "NEW Rank, dev = ", rank, random
END SELECT
CALL MPI_BARRIER(MPI_COMM_WORLD, ierr)
END DO
CALL MPI_FINALIZE(ierr)
END PROGRAM clock_test
2 개 코어 내 워크 스테이션에서 실행하면, 제공 :
그래서 다음 예제 코드를 고려
OLD Rank, dev = 0 0.330676306089146
OLD Rank, dev = 1 0.330676306089146
NEW Rank, dev = 0 0.531503215980609
NEW Rank, dev = 1 0.747413828750221
을 그래서를, 우리는 /dev/urandom
에서 씨앗을 읽어 시계 문제를 극복 대신. 이렇게하면 각 코어가 고유 한 난수를 얻습니다.
멀티 코어 MPI 시스템에서 작동하고 각 코어에서 실행마다 다른 고유 한 접근 방식이있을 수 있습니까?
http://stackoverflow.com/questions/1554958/how-different-do-random-seeds-need-to-be 토론 및 답변에 인용 된 기사를 토대로 시간에 순위 추가하기 모든 씨앗이 선형이기 때문에 의사 - 무작위 수를 생성합니다. 그러나 매우 의사 난수 만 괜찮 으면 시간 + 순위 접근법은 매우 간단하고 플랫폼 독립적입니다. – tpg2114