⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boxmuller.c

📁 C写的用软件无线电实现的GPS模拟程序
💻 C
字号:
/* boxmuller.c           

  Implements the Polar form of the Box-Muller Transformation

  (c) Copyright 1994, Everett F. Carter Jr.
      Permission is granted by the author to use
      this software for any application provided this
      copyright notice is preserved.

*/

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

#define BOXMULLR_H

#include "boxmuller.h"

#undef BOXMULLR_H


inline static float ranf( void)
{
//  return (float)( rand()) / 32767.0;
  return (float)( rand()) / RAND_MAX;
}

/* 
 *  normal random variate generator 
 *  mean m, standard deviation s 
 */
float randn( float m, float s)  
{                                   
  float x1, x2, w, y1;
  static float y2;
  static int use_last   = 0;
  static float rand_max = (float)( RAND_MAX);

  if ( use_last)            /* use value from previous call */
  {
    y1 = y2;
    use_last = 0;
  }
  else
  {
    do 
    {
//      x1 = 2.0 * ranf() - 1.0;
//      x2 = 2.0 * ranf() - 1.0;
      x1 = 2.0 * (float)( rand()) / rand_max - 1.0;
      x2 = 2.0 * (float)( rand()) / rand_max - 1.0;
      w = x1 * x1 + x2 * x2;
    } while ( w >= 1.0);

    w  = sqrt( (-2.0 * log( w) ) / w );
    y1 = x1 * w;
    y2 = x2 * w;
    use_last = 1;
  }

  return ( m + y1 * s);
}


/* 
 *  normal random variate generator 
 *  mean m, standard deviation s 
 */
double randndbl( double m, double s)  
{                                   
  double x1, x2, w, y1;
  static double y2;
  static int use_last   = 0;
  static double rand_max = (float)( RAND_MAX);

  if ( use_last)            /* use value from previous call */
  {
    y1 = y2;
    use_last = 0;
  }
  else
  {
    do 
    {
//      x1 = 2.0 * ranf() - 1.0;
//      x2 = 2.0 * ranf() - 1.0;
      x1 = 2.0 * (double)( rand()) / rand_max - 1.0;
      x2 = 2.0 * (double)( rand()) / rand_max - 1.0;
      w = x1 * x1 + x2 * x2;
    } while ( w >= 1.0 );

    w = sqrt( (-2.0 * log( w ) ) / w );
    y1 = x1 * w;
    y2 = x2 * w;
    use_last = 1;
  }

  return( m + y1 * s );
}

/* ============================== End of File ============================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -