Changeset 26616


Ignore:
Timestamp:
11/12/21 09:49:12 (3 years ago)
Author:
bulthuis
Message:

CGH: add lognormal, chi-squared, and exponential distributions to pseudo-random generator

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

Legend:

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

    r26613 r26616  
    9393        double normal_distribution::generator(rnd::linear_congruential_engine random_engine){/*{{{*/
    9494
    95                         rnd::uniform_distribution       unifdistri;
     95                        rnd::uniform_distribution       distribution;
    9696
    97                         double u1 = unifdistri.generator(random_engine);
    98                         double u2 = unifdistri.generator(random_engine);
     97                        double u1 = distribution.generator(random_engine);
     98                        double u2 = distribution.generator(random_engine);
    9999
    100100                        double R = sqrt(-2*log(u1));
     
    106106        /*}}}*/
    107107
     108  /* Log-Normal distribution */
     109
     110  lognormal_distribution::lognormal_distribution(){/*{{{*/
     111      logmean   = 0;
     112      logsdev  = 1.0;
     113      return;
     114  }
     115  /*}}}*/
     116
     117  lognormal_distribution::lognormal_distribution(double m,double s){/*{{{*/
     118      logmean   = m;
     119      logsdev  = s;
     120      return;
     121  }
     122  /*}}}*/
     123
     124  lognormal_distribution::~lognormal_distribution(){}
     125
     126  double lognormal_distribution::generator(rnd::linear_congruential_engine random_engine){/*{{{*/
     127
     128      rnd::normal_distribution  distribution(logmean,logsdev);
     129
     130      return exp(distribution.generator(random_engine));
     131
     132  }
     133  /*}}}*/
     134
     135  /* Chi-squared distribution */
     136
     137  chi_squared_distribution::chi_squared_distribution(){/*{{{*/
     138      k  = 1;
     139      return;
     140  }
     141  /*}}}*/
     142
     143  chi_squared_distribution::chi_squared_distribution(unsigned int dof){/*{{{*/
     144      k   = dof;
     145      return;
     146  }
     147  /*}}}*/
     148
     149  chi_squared_distribution::~chi_squared_distribution(){}
     150
     151  double chi_squared_distribution::generator(rnd::linear_congruential_engine random_engine){/*{{{*/
     152
     153      rnd::normal_distribution  distribution;
     154
     155      double rand = 0;
     156
     157      for(int i=0;i<k;i++)
     158        rand = rand + pow(distribution.generator(random_engine),2);
     159
     160      return rand;
     161
     162  }
     163  /*}}}*/
     164
     165
     166  /* Exponential distribution */
     167
     168  exponential_distribution::exponential_distribution(){/*{{{*/
     169      lambda  = 1.0;
     170      return;
     171  }
     172  /*}}}*/
     173
     174  exponential_distribution::exponential_distribution(double scale){/*{{{*/
     175      lambda   = scale;
     176      return;
     177  }
     178  /*}}}*/
     179
     180  exponential_distribution::~exponential_distribution(){}
     181
     182  double exponential_distribution::generator(rnd::linear_congruential_engine random_engine){/*{{{*/
     183
     184      rnd::uniform_distribution distribution;
     185
     186      return -1.0/lambda*log(1.0-distribution.generator(random_engine));
     187
     188  }
     189  /*}}}*/
     190
    108191}
  • issm/trunk-jpl/src/c/shared/Random/randomgenerator.h

    r26612 r26616  
    6868  };
    6969
     70  class lognormal_distribution
     71  {
     72
     73    private:
     74      double logmean;
     75      double logsdev;
     76
     77    public:
     78
     79      /*constructors, destructors: */
     80      lognormal_distribution();
     81      lognormal_distribution(double m,double s);
     82      ~lognormal_distribution();
     83
     84      double generator(rnd::linear_congruential_engine random_engine);
     85
     86  };
     87
     88  class chi_squared_distribution
     89  {
     90
     91    private:
     92      unsigned int k;
     93
     94    public:
     95
     96      /*constructors, destructors: */
     97      chi_squared_distribution();
     98      chi_squared_distribution(unsigned int k);
     99      ~chi_squared_distribution();
     100
     101      double generator(rnd::linear_congruential_engine random_engine);
     102
     103  };
     104
     105  class exponential_distribution
     106  {
     107
     108    private:
     109      double lambda;
     110
     111    public:
     112
     113      /*constructors, destructors: */
     114      exponential_distribution();
     115      exponential_distribution(double scale);
     116      ~exponential_distribution();
     117
     118      double generator(rnd::linear_congruential_engine random_engine);
     119
     120  };
     121
    70122
    71123}
Note: See TracChangeset for help on using the changeset viewer.