
# RANDLIB ܿȤ

RANDLIB ˴ޤޤ RNGU0 ϥƥब뤹ȯ롼Ѥ
. ƥඡ롼󤬤ʤˤ, RNGU1 ƱΥ롼Ѱ
Ƥ褤. ޤ, ᥤե졼Ϥη׻, integer overflow ̵
褦ʷ׻Ǥ32ӥåȤȤä軻ƱˡΥ롼ѰդΤ
褤. 

ΥѥåǤ C ǽ񤫤줿ΤɸȤƤ. 

ʤ rngu0.c μ̻ҤϼΤ褦ʰ̣. 

  RAND_MAX : ؿ rand ˤä֤뵿κ

ϤդĤ, stdlib.h Ƥ. 

ʲ, SunFORTRAN 1.4, Lahey Fortran  C  (Sun Ӥ
ΥƥѤ2)ǵҤ򼨤. 

Sun ѤΤΤˤĤƤ:

  FLOATFUNCTIONTYPE, RETURNFLOAT : Fortran  C μ¿ؿˤ륤
    եϥޥˤäưۤʤ. FLOATFUNCTIONTYPE  C δؿ
    η, RETURNFLOAT  C  Fortran ͤäƵΥڥ졼
    򤢤魯. 

ˡ, SunFORTRAN 1.4 Ѥ Fortran  C δؿƤӽФ
򤹤뤿˻ȤƤ, SunFORTRAN 2 ʾѤƤ
ˤפȤʤ. 

, math.h Ƥ. 

*-----------------------------------------------------------------------
*     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)
 */

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

#ifndef LONG_MAX
#define LONG_MAX 0x7FFFFFFF
#endif

#ifndef RAND_MAX
#define RAND_MAX LONG_MAX
#endif

#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);
    }
}
