Changeset 26602


Ignore:
Timestamp:
11/10/21 18:45:38 (3 years ago)
Author:
bulthuis
Message:

CHG: add member functions for random generators in a separate file

Location:
issm/trunk-jpl/src/c/shared/Random
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/shared/Random/randomgenerator.cpp

    r26599 r26602  
    55#include <iostream>
    66#include "./randomgenerator.h"
     7#include <cmath>
     8
    79
    810#undef M_PI
     
    2022}
    2123/*}}}*/
     24rnd_uniform_distribution::rnd_uniform_distribution(double lower,double upper){/*{{{*/
     25
     26                a   = 1103515245;               // BSD Formula
     27                c  = 12345;                                     // BSD Formula
     28                m = 2147483648;                 // BSD Formula
     29                _seed = 0;
     30                lbound = lower;
     31                ubound = upper;
     32                return;
     33}
     34/*}}}*/
     35rnd_uniform_distribution::~rnd_uniform_distribution(){}
     36void rnd_uniform_distribution::seed( unsigned int s ) { _seed = s; }
     37unsigned int rnd_uniform_distribution::get_seed() { return _seed; }
     38double rnd_uniform_distribution::generator() {
     39                _seed = ( a * _seed + c ) % m ;
     40                return (ubound-lbound)*(double) _seed/ m + lbound;
     41}
     42
     43
     44rnd_normal_distribution::rnd_normal_distribution(){/*{{{*/
     45
     46                _seed = 0;
     47                mean   = 0;
     48                sdev  = 1.0;
     49                return;
     50}
     51/*}}}*/
     52rnd_normal_distribution::rnd_normal_distribution(double m,double s){/*{{{*/
     53
     54                _seed = 0;
     55                mean   = m;
     56                sdev  = s;
     57                return;
     58}
     59        /*}}}*/
     60rnd_normal_distribution::~rnd_normal_distribution(){}
     61void rnd_normal_distribution::seed( unsigned int s ) { _seed = s; }
     62double rnd_normal_distribution::generator(){/*{{{*/
     63
     64                rnd_uniform_distribution        unifdistri;
     65                unifdistri.seed(_seed);
     66
     67                double u1 = unifdistri.generator();
     68                double u2 = unifdistri.generator();
     69
     70                double R = sqrt(-2*log(u1));
     71                double theta = 2*M_PI*u2;
     72
     73                seed(unifdistri.get_seed());
     74
     75                return mean + sdev * (R*cos(theta));
     76
     77}
     78/*}}}*/
  • issm/trunk-jpl/src/c/shared/Random/randomgenerator.h

    r26599 r26602  
    55#ifndef _RANDOMGENERATOR_H_
    66#define _RANDOMGENERATOR_H_
    7 
    8 /*Headers:*/
    9 /*{{{*/
    10 #include <cmath>
    11 /*}}}*/
    127
    138#undef M_PI
     
    2924    /*constructors, destructors: */
    3025    rnd_uniform_distribution();
    31     rnd_uniform_distribution(double a_1,double a_2) : _seed( 0 ), a( 1103515245 ), c( 12345 ), m( 2147483648 ), lbound(a_1), ubound(a_2) {}
    32     ~rnd_uniform_distribution(){}
     26    rnd_uniform_distribution(double a_1,double a_2);
     27    ~rnd_uniform_distribution();
    3328
    34     void seed( unsigned int s ) { _seed = s; }
    35     unsigned int get_seed() { return _seed; }
    36     double generator(){
    37       _seed = ( a * _seed + c ) % m;
    38       return (ubound-lbound)*(double) _seed/ m + lbound;
    39     }
     29    void seed( unsigned int s );
     30    unsigned int get_seed();
     31    double generator();
    4032
    4133};
     
    5244
    5345    /*constructors, destructors: */
    54     rnd_normal_distribution() : _seed( 0 ), mean( 0), sdev(1.0) {}
    55     rnd_normal_distribution(double m,double s) : _seed( 0 ), mean( m ), sdev(s) {}
    56     ~rnd_normal_distribution(){}
     46    rnd_normal_distribution();
     47    rnd_normal_distribution(double m,double s);
     48    ~rnd_normal_distribution();
    5749
    58     void seed( unsigned int s ) { _seed = s; }
    59     double generator()
    60     {
    61       rnd_uniform_distribution unifdistri;
    62       unifdistri.seed(_seed);
    63 
    64       double u1 = unifdistri.generator();
    65       double u2 = unifdistri.generator();
    66 
    67       double R = sqrt(-2*log(u1));
    68       double theta = 2*M_PI*u2;
    69 
    70       seed(unifdistri.get_seed());
    71 
    72       return mean + sdev * (R*cos(theta));
    73 
    74     }
     50    void seed( unsigned int s );
     51    double generator();
    7552
    7653};
Note: See TracChangeset for help on using the changeset viewer.