IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 3001


Ignore:
Timestamp:
Jan 14, 2005, 1:34:46 PM (22 years ago)
Author:
evanalst
Message:

Add functionality to get random number from system if seed equal to zero.

Location:
trunk/psLib/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/dataManip/psRandom.c

    r2996 r3001  
    1010*  @author GLG, MHPCC
    1111*
    12 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2005-01-14 21:22:55 $
     12*  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2005-01-14 23:34:46 $
    1414*
    1515*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    2020#include <float.h>
    2121#include <math.h>
     22#include <time.h>
    2223#include <gsl/gsl_rng.h>
    2324#include <gsl/gsl_randist.h>
     
    3233#include "psDataManipErrors.h"
    3334
    34 /*
    35  typedef enum {
    36      PS_RANDOM_TAUS
    37  } psRandomType;
    38  
    39  typedef struct {
    40      psRandomType type;
    41      gsl_rng *gsl;
    42  } psRandom;
    43 */
     35psU64 p_psRandomGetSystemSeed()
     36{
     37    FILE*  fd;
     38    psU64  seedVal = 0;
     39    time_t timeVal;
    4440
     41    fd = fopen("/dev/urandom","r");
     42    if(fd == NULL) {
     43        // Read system clock to get seed
     44        seedVal = (psU64)time(&timeVal);
     45    } else {
     46        // Read urandom to get seed
     47        fread(&seedVal, sizeof(psU64),1,fd);
     48        // Close file
     49        fclose(fd);
     50    }
     51
     52    return seedVal;
     53}
    4554
    4655psRandom *psRandomAlloc(psRandomType type,
    4756                        psU64 seed)
    4857{
    49     gsl_rng *r = NULL;
    50     psRandom *myRNG = (psRandom *) psAlloc(sizeof(psRandom));
     58    gsl_rng   *r      = NULL;
     59    psRandom  *myRNG  = NULL;
    5160
    5261    switch (type) {
    5362    case PS_RANDOM_TAUS:
     63        myRNG = (psRandom*)psAlloc(sizeof(psRandom));
    5464        r = gsl_rng_alloc(gsl_rng_taus);
    5565        myRNG->gsl = r;
    56         return(myRNG);
     66        if(seed == 0) {
     67            gsl_rng_set(myRNG->gsl,p_psRandomGetSystemSeed());
     68        }
     69        break;
    5770
    5871    default:
    59         psFree(myRNG);
    6072        psError(PS_ERR_UNEXPECTED_NULL,
    6173                true,
    6274                PS_ERRORTEXT_psRandom_UNKNOWN_RANDFOM_NUMBER_GENERATOR_TYPE);
     75        break;
    6376    }
    64     return(NULL);
     77    return(myRNG);
    6578}
    6679
  • trunk/psLib/src/math/psRandom.c

    r2996 r3001  
    1010*  @author GLG, MHPCC
    1111*
    12 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2005-01-14 21:22:55 $
     12*  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2005-01-14 23:34:46 $
    1414*
    1515*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    2020#include <float.h>
    2121#include <math.h>
     22#include <time.h>
    2223#include <gsl/gsl_rng.h>
    2324#include <gsl/gsl_randist.h>
     
    3233#include "psDataManipErrors.h"
    3334
    34 /*
    35  typedef enum {
    36      PS_RANDOM_TAUS
    37  } psRandomType;
    38  
    39  typedef struct {
    40      psRandomType type;
    41      gsl_rng *gsl;
    42  } psRandom;
    43 */
     35psU64 p_psRandomGetSystemSeed()
     36{
     37    FILE*  fd;
     38    psU64  seedVal = 0;
     39    time_t timeVal;
    4440
     41    fd = fopen("/dev/urandom","r");
     42    if(fd == NULL) {
     43        // Read system clock to get seed
     44        seedVal = (psU64)time(&timeVal);
     45    } else {
     46        // Read urandom to get seed
     47        fread(&seedVal, sizeof(psU64),1,fd);
     48        // Close file
     49        fclose(fd);
     50    }
     51
     52    return seedVal;
     53}
    4554
    4655psRandom *psRandomAlloc(psRandomType type,
    4756                        psU64 seed)
    4857{
    49     gsl_rng *r = NULL;
    50     psRandom *myRNG = (psRandom *) psAlloc(sizeof(psRandom));
     58    gsl_rng   *r      = NULL;
     59    psRandom  *myRNG  = NULL;
    5160
    5261    switch (type) {
    5362    case PS_RANDOM_TAUS:
     63        myRNG = (psRandom*)psAlloc(sizeof(psRandom));
    5464        r = gsl_rng_alloc(gsl_rng_taus);
    5565        myRNG->gsl = r;
    56         return(myRNG);
     66        if(seed == 0) {
     67            gsl_rng_set(myRNG->gsl,p_psRandomGetSystemSeed());
     68        }
     69        break;
    5770
    5871    default:
    59         psFree(myRNG);
    6072        psError(PS_ERR_UNEXPECTED_NULL,
    6173                true,
    6274                PS_ERRORTEXT_psRandom_UNKNOWN_RANDFOM_NUMBER_GENERATOR_TYPE);
     75        break;
    6376    }
    64     return(NULL);
     77    return(myRNG);
    6578}
    6679
Note: See TracChangeset for help on using the changeset viewer.