gausrand.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:2k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = gausrand.cpp
  3. //
  4. #include <math.h>
  5. #include "uni_rand.h"
  6. #include "gausrand.h"
  7.  
  8. void GaussRandom(long *seed, float *result)
  9. {
  10.  double x1, x2, g1; 
  11.  double XA, XB, big_S;
  12.  double radical;
  13.  big_S=1.0;
  14.  while(big_S >= 1.0){
  15.    XA = DoubleUniformRandom(seed);
  16.    XB = DoubleUniformRandom(seed);
  17.    x1 = 1.0 - 2.0 * XA;
  18.    x2 = 1.0 - 2.0 * XB;
  19.  big_S = x1*x1 + x2*x2;
  20.  }
  21.  radical = sqrt(-2.0*log(big_S)/big_S);
  22.  g1 = x1 * radical;
  23.  *result = float(g1);
  24. }
  25. //------------------------------------------------
  26. void GaussRandom(long *seed, double *result)
  27. {
  28.  double x1, x2, g1; 
  29.  double XA, XB, big_S;
  30.  double radical;
  31.  big_S=1.0;
  32.  while(big_S >= 1.0){
  33.    XA = DoubleUniformRandom(seed);
  34.    XB = DoubleUniformRandom(seed);
  35.    x1 = 1.0 - 2.0 * XA;
  36.    x2 = 1.0 - 2.0 * XB;
  37.    big_S = x1*x1 + x2*x2;
  38.  }
  39.  radical = sqrt(-2.0*log(big_S)/big_S);
  40.  g1 = x1 * radical;
  41.  *result = g1;
  42. }
  43. //------------------------------------------------
  44. void GaussRandom(long *seed, std::complex<double> *result)
  45. {
  46.  double x1, x2, g1, g2; 
  47.  double XA, XB, big_S;
  48.  double radical;
  49.  big_S=1.0;
  50.  while(big_S >= 1.0){
  51.    XA = DoubleUniformRandom(seed);
  52.    XB = DoubleUniformRandom(seed);
  53.    x1 = 1.0 - 2.0 * XA;
  54.    x2 = 1.0 - 2.0 * XB;
  55.    big_S = x1*x1 + x2*x2;
  56.  }
  57.  radical = sqrt(-2.0*log(big_S)/big_S);
  58.  g1 = x1 * radical;
  59.  g2 = x2 * radical;
  60.  *result = std::complex<double>(g1, g2);
  61. }
  62. //------------------------------------------------
  63. void GaussRandom(long *seed, std::complex<float> *result)
  64. {
  65.  double x1, x2;
  66.  float g1, g2; 
  67.  double XA, XB, big_S;
  68.  double radical;
  69.  big_S=1.0;
  70.  while(big_S >= 1.0){
  71.    XA = DoubleUniformRandom(seed);
  72.    XB = DoubleUniformRandom(seed);
  73.    x1 = 1.0 - 2.0 * XA;
  74.    x2 = 1.0 - 2.0 * XB;
  75.    big_S = x1*x1 + x2*x2;
  76.  }
  77.  radical = sqrt(-2.0*log(big_S)/big_S);
  78.  g1 = float(x1 * radical);
  79.  g2 = float(x2 * radical);
  80.  *result = std::complex<float>(g1, g2);
  81. }