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