# RANDLIB ڐAƂ̒

RANDLIB Ɋ܂܂ RNGU0 ̓VXe闐[`gp
. VXe[`Ȃꍇɂ, RNGU1 Ɠ̃[`p
Ă悢. ȉ, SunFORTRAN 1.4, Lahey Fortran  C  (Sun 
тȊÕVXep2)ŋLq. ܂, Ct[
ňvZ@, integer overflow 𖳎悤ȌvZ@ł32rbg
gZ@̃[`pӂ̂悢.

Ȃ C ̗̒̎ʎq͎̂悤ȈӖ. 

  RAND_MAX : ֐ rand ɂĕԂ^̍ől

͂ӂ, stdlib.h ̒Œ`Ă. 

 Sun p̂̂ɂĂ:

  FLOATFUNCTIONTYPE, RETURNFLOAT : Fortran  C ̎^֐ɂC
    ^[tFCX̓}VɂĈقȂ. FLOATFUNCTIONTYPE  C ̊֐
    `̌^, RETURNFLOAT  C  Fortran ֒lċA鎞̃Iy[
    V킷. 

, math.h ̒Œ`Ă. 

C p̃\[X rngu0.c.sun  rngu0.c.others pӂĂ,
make ̍, gbvfBNgɂ Mkinclude ̒ RANDLIB  sun 
邢 others ̂ǂ炩w肷邱ƂɂđI. 

*-----------------------------------------------------------------------
*     RANDOM NUMBER GENERATOR (Sun Fortran)
*-----------------------------------------------------------------------

      FUNCTION RNGU0(ISEED)
      LOGICAL  LFIRST
      SAVE
      DATA     LFIRST / .TRUE. /

      IF(ISEED.NE.0) THEN
        ISEED = ABS(ISEED) + 1
        RNGU0 = RAND(ISEED)       ! 
        ISEED  = 0
        LFIRST = .FALSE.
      ELSE
        IF(LFIRST) CALL MSGDMP('E', 'RNGU0',
     #                         'ISEED MUST BE > 0 FOR 1ST CALL.')
        RNGU0=RAND(0)             ! 
      ENDIF

      RETURN
      END
*-----------------------------------------------------------------------
*     RANDOM NUMBER GENERATOR (Lahey Fortran)
*-----------------------------------------------------------------------

      FUNCTION RNGU0(ISEED)
      LOGICAL  LFIRST
      SAVE
      DATA     LFIRST / .TRUE. /

      IF(ISEED.NE.0) THEN
        X = REAL(ABS(ISEED))/10000.
        RNGU0 = RANDS(X)
        ISEED  = 0
        LFIRST = .FALSE.
      ELSE
        IF(LFIRST) CALL MSGDMP('E', 'RNGU0',
     #                         'ISEED MUST BE > 0 FOR 1ST CALL.')
        RNGU0=RND()
      ENDIF

      RETURN
      END

/*
 *    rngu0 (written in C for sun)
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define TRUE   1             /* numeric value for true  */
#define FALSE  0             /* numeric value for false */

#define RAND_MAX 0x7FFFFFFF

static int lfirst = TRUE;

FLOATFUNCTIONTYPE rngu0_(iseed)
    int *iseed;
{
    if (*iseed != 0){
	*iseed = abs(*iseed) + 1;
	srand(*iseed);
	*iseed = 0;
	lfirst = FALSE;
	RETURNFLOAT((float)rand()/(float)RAND_MAX);
    }
    else {
	if (lfirst){
	    fprintf (stderr, "*** Error in rngu0 : ");
	    fprintf (stderr, "Iseed must be > 0 for 1st call.\n");
	    exit(1);
	}
	RETURNFLOAT((float)rand()/(float)RAND_MAX);
    }
}

/*
 *    rngu0 (written in C for others)
 */

#include <stdio.h>
#include <stdlib.h>

#define TRUE   1             /* numeric value for true  */
#define FALSE  0             /* numeric value for false */

static int lfirst = TRUE;

float rngu0_(iseed)
    int *iseed;
{
    if (*iseed != 0){
	*iseed = abs(*iseed) + 1;
	srand(*iseed);
	*iseed = 0;
	lfirst = FALSE;
	return((float)rand()/(float)RAND_MAX);
    }
    else {
	if (lfirst){
	    fprintf (stderr, "*** Error in rngu0 : ");
	    fprintf (stderr, "Iseed must be > 0 for 1st call.\n");
	    exit(1);
	}
	return((float)rand()/(float)RAND_MAX);
    }
}
