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

📄 random.c

📁 开放gsl矩阵运算
💻 C
字号:
/* rng/random.c *  * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough *  * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <config.h>#include <stdlib.h>#include <gsl/gsl_rng.h>/* This file provides support for random() generators. There are three   versions in widespread use today,   - The original BSD version, e.g. on SunOS 4.1 and FreeBSD.   - The Linux libc5 version, which is differs from the BSD version in   its seeding procedure, possibly due to the introduction of a typo   in the multiplier.   - The GNU glibc2 version, which has a new (and better) seeding   procedure.   They all produce different numbers, due to the different seeding   algorithms, but the algorithm for the generator is the same in each   case.   */static inline long int random_get (int * i, int * j, int n, long int * x);static inline unsigned long int random8_get (void *vstate);static inline unsigned long int random32_get (void *vstate);static inline unsigned long int random64_get (void *vstate);static inline unsigned long int random128_get (void *vstate);static inline unsigned long int random256_get (void *vstate);static double random8_get_double (void *vstate);static double random32_get_double (void *vstate);static double random64_get_double (void *vstate);static double random128_get_double (void *vstate);static double random256_get_double (void *vstate);static void random8_glibc2_set (void *state, unsigned long int s);static void random32_glibc2_set (void *state, unsigned long int s);static void random64_glibc2_set (void *state, unsigned long int s);static void random128_glibc2_set (void *state, unsigned long int s);static void random256_glibc2_set (void *state, unsigned long int s);static void random8_libc5_set (void *state, unsigned long int s);static void random32_libc5_set (void *state, unsigned long int s);static void random64_libc5_set (void *state, unsigned long int s);static void random128_libc5_set (void *state, unsigned long int s);static void random256_libc5_set (void *state, unsigned long int s);static void random8_bsd_set (void *state, unsigned long int s);static void random32_bsd_set (void *state, unsigned long int s);static void random64_bsd_set (void *state, unsigned long int s);static void random128_bsd_set (void *state, unsigned long int s);static void random256_bsd_set (void *state, unsigned long int s);static void bsd_initialize (long int * x, int n, unsigned long int s);static void libc5_initialize (long int * x, int n, unsigned long int s);static void glibc2_initialize (long int * x, int n, unsigned long int s);typedef struct  {    long int x;  }random8_state_t;typedef struct  {    int i, j;    long int x[7];  }random32_state_t;typedef struct  {    int i, j;    long int x[15];  }random64_state_t;typedef struct  {    int i, j;    long int x[31];  }random128_state_t;typedef struct  {    int i, j;    long int x[63];  }random256_state_t;static inline unsigned long intrandom8_get (void *vstate){  random8_state_t *state = (random8_state_t *) vstate;  state->x = (1103515245 * state->x + 12345) & 0x7fffffffUL;  return state->x;}static inline long intrandom_get (int * i, int * j, int n, long int * x){  long int k ;  x[*i] += x[*j] ;  k = (x[*i] >> 1) & 0x7FFFFFFF ;    (*i)++ ;  if (*i == n)    *i = 0 ;    (*j)++ ;  if (*j == n)    *j = 0 ;  return k ;}static inline unsigned long intrandom32_get (void *vstate){  random32_state_t *state = (random32_state_t *) vstate;  unsigned long int k = random_get (&state->i, &state->j, 7, state->x) ;   return k ;}static inline unsigned long intrandom64_get (void *vstate){  random64_state_t *state = (random64_state_t *) vstate;  long int k = random_get (&state->i, &state->j, 15, state->x) ;   return k ;}static inline unsigned long intrandom128_get (void *vstate){  random128_state_t *state = (random128_state_t *) vstate;  unsigned long int k = random_get (&state->i, &state->j, 31, state->x) ;   return k ;}static inline unsigned long intrandom256_get (void *vstate){  random256_state_t *state = (random256_state_t *) vstate;  long int k = random_get (&state->i, &state->j, 63, state->x) ;   return k ;}static doublerandom8_get_double (void *vstate){  return random8_get (vstate) / 2147483648.0 ;}static doublerandom32_get_double (void *vstate){  return random32_get (vstate) / 2147483648.0 ;}static doublerandom64_get_double (void *vstate){  return random64_get (vstate) / 2147483648.0 ;}static doublerandom128_get_double (void *vstate){  return random128_get (vstate) / 2147483648.0 ;}static doublerandom256_get_double (void *vstate){  return random256_get (vstate) / 2147483648.0 ;}static voidrandom8_bsd_set (void *vstate, unsigned long int s){  random8_state_t *state = (random8_state_t *) vstate;    if (s == 0)     s = 1;  state->x = s;}static voidrandom32_bsd_set (void *vstate, unsigned long int s){  random32_state_t *state = (random32_state_t *) vstate;  int i;  bsd_initialize (state->x, 7, s) ;  state->i = 3;  state->j = 0;    for (i = 0 ; i < 10 * 7 ; i++)    random32_get (state) ; }static voidrandom64_bsd_set (void *vstate, unsigned long int s){  random64_state_t *state = (random64_state_t *) vstate;  int i;  bsd_initialize (state->x, 15, s) ;  state->i = 1;  state->j = 0;    for (i = 0 ; i < 10 * 15 ; i++)    random64_get (state) ; }static voidrandom128_bsd_set (void *vstate, unsigned long int s){  random128_state_t *state = (random128_state_t *) vstate;  int i;  bsd_initialize (state->x, 31, s) ;  state->i = 3;  state->j = 0;    for (i = 0 ; i < 10 * 31 ; i++)    random128_get (state) ; }static voidrandom256_bsd_set (void *vstate, unsigned long int s){  random256_state_t *state = (random256_state_t *) vstate;  int i;  bsd_initialize (state->x, 63, s) ;  state->i = 1;  state->j = 0;    for (i = 0 ; i < 10 * 63 ; i++)    random256_get (state) ; }static void bsd_initialize (long int * x, int n, unsigned long int s){  int i;   if (s == 0)    s = 1 ;  x[0] = s;  for (i = 1 ; i < n ; i++)    x[i] = 1103515245 * x[i-1] + 12345 ;}static void libc5_initialize (long int * x, int n, unsigned long int s){  int i;   if (s == 0)    s = 1 ;  x[0] = s;  for (i = 1 ; i < n ; i++)    x[i] = 1103515145 * x[i-1] + 12345 ;}static void glibc2_initialize (long int * x, int n, unsigned long int s){  int i;   if (s == 0)    s = 1 ;  x[0] = s;  for (i = 1 ; i < n ; i++)    {      const long int h = s / 127773;      const long int t = 16807 * (s - h * 127773) - h * 2836;      if (t < 0)	{	  s = t + 2147483647 ;	}      else	{	  s = t ;	}    x[i] = s ;    }}static voidrandom8_glibc2_set (void *vstate, unsigned long int s){  random8_state_t *state = (random8_state_t *) vstate;    if (s == 0)     s = 1;  state->x = s;}static voidrandom32_glibc2_set (void *vstate, unsigned long int s){  random32_state_t *state = (random32_state_t *) vstate;  int i;  glibc2_initialize (state->x, 7, s) ;  state->i = 3;  state->j = 0;    for (i = 0 ; i < 10 * 7 ; i++)    random32_get (state) ; }static voidrandom64_glibc2_set (void *vstate, unsigned long int s){  random64_state_t *state = (random64_state_t *) vstate;  int i;  glibc2_initialize (state->x, 15, s) ;  state->i = 1;  state->j = 0;    for (i = 0 ; i < 10 * 15 ; i++)    random64_get (state) ; }static voidrandom128_glibc2_set (void *vstate, unsigned long int s){  random128_state_t *state = (random128_state_t *) vstate;  int i;  glibc2_initialize (state->x, 31, s) ;  state->i = 3;  state->j = 0;    for (i = 0 ; i < 10 * 31 ; i++)    random128_get (state) ; }static voidrandom256_glibc2_set (void *vstate, unsigned long int s){  random256_state_t *state = (random256_state_t *) vstate;  int i;  glibc2_initialize (state->x, 63, s) ;  state->i = 1;  state->j = 0;    for (i = 0 ; i < 10 * 63 ; i++)    random256_get (state) ; }static voidrandom8_libc5_set (void *vstate, unsigned long int s){  random8_state_t *state = (random8_state_t *) vstate;    if (s == 0)     s = 1;  state->x = s;}static voidrandom32_libc5_set (void *vstate, unsigned long int s){  random32_state_t *state = (random32_state_t *) vstate;  int i;  libc5_initialize (state->x, 7, s) ;  state->i = 3;  state->j = 0;    for (i = 0 ; i < 10 * 7 ; i++)    random32_get (state) ; }static voidrandom64_libc5_set (void *vstate, unsigned long int s){  random64_state_t *state = (random64_state_t *) vstate;  int i;  libc5_initialize (state->x, 15, s) ;  state->i = 1;  state->j = 0;    for (i = 0 ; i < 10 * 15 ; i++)    random64_get (state) ; }static voidrandom128_libc5_set (void *vstate, unsigned long int s){  random128_state_t *state = (random128_state_t *) vstate;  int i;  libc5_initialize (state->x, 31, s) ;  state->i = 3;  state->j = 0;    for (i = 0 ; i < 10 * 31 ; i++)    random128_get (state) ; }static voidrandom256_libc5_set (void *vstate, unsigned long int s){  random256_state_t *state = (random256_state_t *) vstate;  int i;  libc5_initialize (state->x, 63, s) ;  state->i = 1;  state->j = 0;    for (i = 0 ; i < 10 * 63 ; i++)    random256_get (state) ; }static const gsl_rng_type random_glibc2_type ={"random-glibc2",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random128_state_t), &random128_glibc2_set, &random128_get, &random128_get_double};static const gsl_rng_type random8_glibc2_type ={"random8-glibc2",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random8_state_t), &random8_glibc2_set, &random8_get, &random8_get_double};static const gsl_rng_type random32_glibc2_type ={"random32-glibc2",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random32_state_t), &random32_glibc2_set, &random32_get, &random32_get_double};static const gsl_rng_type random64_glibc2_type ={"random64-glibc2",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random64_state_t), &random64_glibc2_set, &random64_get, &random64_get_double};static const gsl_rng_type random128_glibc2_type ={"random128-glibc2",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random128_state_t), &random128_glibc2_set, &random128_get, &random128_get_double};static const gsl_rng_type random256_glibc2_type ={"random256-glibc2",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random256_state_t), &random256_glibc2_set, &random256_get, &random256_get_double};static const gsl_rng_type random_libc5_type ={"random-libc5",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random128_state_t), &random128_libc5_set, &random128_get, &random128_get_double};static const gsl_rng_type random8_libc5_type ={"random8-libc5",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random8_state_t), &random8_libc5_set, &random8_get, &random8_get_double};static const gsl_rng_type random32_libc5_type ={"random32-libc5",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random32_state_t), &random32_libc5_set, &random32_get, &random32_get_double};static const gsl_rng_type random64_libc5_type ={"random64-libc5",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random64_state_t), &random64_libc5_set, &random64_get, &random64_get_double};static const gsl_rng_type random128_libc5_type ={"random128-libc5",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random128_state_t), &random128_libc5_set, &random128_get, &random128_get_double};static const gsl_rng_type random256_libc5_type ={"random256-libc5",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random256_state_t), &random256_libc5_set, &random256_get, &random256_get_double};static const gsl_rng_type random_bsd_type ={"random-bsd",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random128_state_t), &random128_bsd_set, &random128_get, &random128_get_double};static const gsl_rng_type random8_bsd_type ={"random8-bsd",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random8_state_t), &random8_bsd_set, &random8_get, &random8_get_double};static const gsl_rng_type random32_bsd_type ={"random32-bsd",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random32_state_t), &random32_bsd_set, &random32_get, &random32_get_double};static const gsl_rng_type random64_bsd_type ={"random64-bsd",			/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random64_state_t), &random64_bsd_set, &random64_get, &random64_get_double};static const gsl_rng_type random128_bsd_type ={"random128-bsd",		/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random128_state_t), &random128_bsd_set, &random128_get, &random128_get_double};static const gsl_rng_type random256_bsd_type ={"random256-bsd",		/* name */ 0x7fffffffUL,			/* RAND_MAX */ 0,				/* RAND_MIN */ sizeof (random256_state_t), &random256_bsd_set, &random256_get, &random256_get_double};const gsl_rng_type *gsl_rng_random_libc5    = &random_libc5_type;const gsl_rng_type *gsl_rng_random8_libc5   = &random8_libc5_type;const gsl_rng_type *gsl_rng_random32_libc5  = &random32_libc5_type;const gsl_rng_type *gsl_rng_random64_libc5  = &random64_libc5_type;const gsl_rng_type *gsl_rng_random128_libc5 = &random128_libc5_type;const gsl_rng_type *gsl_rng_random256_libc5 = &random256_libc5_type;const gsl_rng_type *gsl_rng_random_glibc2    = &random_glibc2_type;const gsl_rng_type *gsl_rng_random8_glibc2   = &random8_glibc2_type;const gsl_rng_type *gsl_rng_random32_glibc2  = &random32_glibc2_type;const gsl_rng_type *gsl_rng_random64_glibc2  = &random64_glibc2_type;const gsl_rng_type *gsl_rng_random128_glibc2 = &random128_glibc2_type;const gsl_rng_type *gsl_rng_random256_glibc2 = &random256_glibc2_type;const gsl_rng_type *gsl_rng_random_bsd    = &random_bsd_type;const gsl_rng_type *gsl_rng_random8_bsd   = &random8_bsd_type;const gsl_rng_type *gsl_rng_random32_bsd  = &random32_bsd_type;const gsl_rng_type *gsl_rng_random64_bsd  = &random64_bsd_type;const gsl_rng_type *gsl_rng_random128_bsd = &random128_bsd_type;const gsl_rng_type *gsl_rng_random256_bsd = &random256_bsd_type;

⌨️ 快捷键说明

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