Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-RAN
Commits
fb6f9d3b
Commit
fb6f9d3b
authored
Dec 16, 2022
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Read /dev/urandom to init RNG for uniformrandom and gaussZiggurat
parent
e695f242
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
111 deletions
+53
-111
openair1/SIMULATION/TOOLS/rangen_double.c
openair1/SIMULATION/TOOLS/rangen_double.c
+51
-36
openair1/SIMULATION/TOOLS/sim.h
openair1/SIMULATION/TOOLS/sim.h
+2
-1
openair2/UTIL/MATH/random.c
openair2/UTIL/MATH/random.c
+0
-74
No files found.
openair1/SIMULATION/TOOLS/rangen_double.c
View file @
fb6f9d3b
...
@@ -26,42 +26,57 @@
...
@@ -26,42 +26,57 @@
#include "sim.h"
#include "sim.h"
static
unsigned
int
seed
,
iy
,
ir
[
98
];
static
unsigned
int
urseed
,
iy
,
ir
[
98
];
/// uniformrandom
/*
static
bool
tableNordDone
=
false
;
/// gaussZiggurat
@defgroup _uniformdouble
@ingroup numerical Uniform linear congruential random number generator.
*/
/*!\brief Initialization routine for Uniform/Gaussian random number generators. */
#define a 1664525lu
#define a 1664525lu
#define mod 4294967296.0
/* is 2**32 */
#define mod 4294967296.0
/* is 2**32 */
#if 1
/*!\brief Generate a random number form `/dev/urandom`. */
void
randominit
(
unsigned
seed_init
)
unsigned
long
get_random_seed
(
void
)
{
{
int
i
;
unsigned
long
seed
;
// this need to be integrated with the existing rng, like taus: navid
const
char
*
fn
=
"/dev/urandom"
;
FILE
*
f
=
fopen
(
fn
,
"rb"
);
if
(
seed_init
==
0
)
{
if
(
f
==
NULL
)
{
srand
((
unsigned
)
time
(
NULL
));
fprintf
(
stderr
,
"could not open %s for seed generation: %d %s
\n
"
,
fn
,
errno
,
strerror
(
errno
));
abort
();
seed
=
(
unsigned
int
)
rand
();
}
}
else
{
int
rc
=
fread
(
&
seed
,
sizeof
(
seed
),
1
,
f
);
seed
=
seed_init
;
if
(
rc
<
0
)
{
fprintf
(
stderr
,
"could not read %s for seed generation: %d %s
\n
"
,
fn
,
errno
,
strerror
(
errno
));
abort
();
}
}
printf
(
"Initializing random number generator, seed %x
\n
"
,
seed
);
fclose
(
f
);
return
seed
;
}
if
(
seed
%
2
==
0
)
seed
+=
1
;
/* seed and mod are relative prime */
for
(
i
=
1
;
i
<=
97
;
i
++
)
{
/*!\brief Initialization routine for Uniform/Gaussian random number generators. */
seed
=
a
*
seed
;
/* mod 2**32 */
void
randominit
(
unsigned
long
seed_init
)
ir
[
i
]
=
seed
;
/* initialize the shuffle table */
{
unsigned
long
seed
=
seed_init
!=
0
?
seed_init
:
get_random_seed
();
printf
(
"Initializing random number generator, seed %ld
\n
"
,
seed
);
// initialize uniformrandom RNG
urseed
=
(
unsigned
int
)
seed
;
if
(
urseed
%
2
==
0
)
urseed
+=
1
;
/* urseed and mod are relative prime */
for
(
int
i
=
1
;
i
<=
97
;
i
++
)
{
urseed
=
a
*
urseed
;
/* mod 2**32 */
ir
[
i
]
=
urseed
;
/* initialize the shuffle table */
}
}
iy
=
1
;
iy
=
1
;
// initialize gaussZiggurat RNG
tableNor
(
seed
);
tableNordDone
=
true
;
}
}
#endif
/*
@defgroup _uniformdouble
@ingroup numerical Uniform linear congruential random number generator.
*/
/*!\brief Uniform linear congruential random number generator on \f$[0,1)\f$. Returns a double-precision floating-point number.*/
/*!\brief Uniform linear congruential random number generator on \f$[0,1)\f$. Returns a double-precision floating-point number.*/
...
@@ -70,13 +85,11 @@ double uniformrandom(void)
...
@@ -70,13 +85,11 @@ double uniformrandom(void)
#define a 1664525lu
#define a 1664525lu
#define mod 4294967296.0
/* is 2**32 */
#define mod 4294967296.0
/* is 2**32 */
int
j
;
int
j
=
1
+
97
.
0
*
iy
/
mod
;
iy
=
ir
[
j
];
j
=
1
+
97
.
0
*
iy
/
mod
;
urseed
=
a
*
urseed
;
/* mod 2**32 */
iy
=
ir
[
j
];
ir
[
j
]
=
urseed
;
seed
=
a
*
seed
;
/* mod 2**32 */
return
(
double
)
iy
/
mod
;
ir
[
j
]
=
seed
;
return
(
(
double
)
iy
/
mod
);
}
}
/*
/*
...
@@ -109,8 +122,12 @@ double __attribute__ ((no_sanitize_address)) gaussdouble(double mean, double var
...
@@ -109,8 +122,12 @@ double __attribute__ ((no_sanitize_address)) gaussdouble(double mean, double var
}
}
}
}
/*
@defgroup _gaussZiggurat
@ingroup numerical ziggurat random number generator for exponentially distributed numbers
*/
// Ziggurat
// Ziggurat
static
bool
tableNordDone
=
false
;
static
double
wn
[
128
],
fn
[
128
];
static
double
wn
[
128
],
fn
[
128
];
static
uint32_t
iz
,
jz
,
jsr
=
123456789
,
kn
[
128
];
static
uint32_t
iz
,
jz
,
jsr
=
123456789
,
kn
[
128
];
static
int32_t
hz
;
static
int32_t
hz
;
...
@@ -180,9 +197,7 @@ double __attribute__ ((no_sanitize_address)) gaussZiggurat(double mean, double v
...
@@ -180,9 +197,7 @@ double __attribute__ ((no_sanitize_address)) gaussZiggurat(double mean, double v
{
{
if
(
!
tableNordDone
)
{
if
(
!
tableNordDone
)
{
// let's make reasonnable constant tables
// let's make reasonnable constant tables
struct
timespec
t
;
tableNor
(
get_random_seed
());
clock_gettime
(
CLOCK_MONOTONIC
,
&
t
);
tableNor
((
long
)(
t
.
tv_nsec
%
INT_MAX
));
}
}
hz
=
SHR3
;
hz
=
SHR3
;
iz
=
hz
&
127
;
iz
=
hz
&
127
;
...
...
openair1/SIMULATION/TOOLS/sim.h
View file @
fb6f9d3b
...
@@ -523,8 +523,9 @@ the value \f$\mathrm{sgn}(u)i\f$. The search requires at most \f$Nbits-1\f$ com
...
@@ -523,8 +523,9 @@ the value \f$\mathrm{sgn}(u)i\f$. The search requires at most \f$Nbits-1\f$ com
*/
*/
int
gauss
(
unsigned
int
*
gauss_LUT
,
unsigned
char
Nbits
);
int
gauss
(
unsigned
int
*
gauss_LUT
,
unsigned
char
Nbits
);
unsigned
long
get_random_seed
(
void
);
double
gaussdouble
(
double
,
double
);
double
gaussdouble
(
double
,
double
);
void
randominit
(
unsigned
int
seed_init
);
void
randominit
(
unsigned
long
seed_init
);
double
uniformrandom
(
void
);
double
uniformrandom
(
void
);
double
gaussZiggurat
(
double
mean
,
double
variance
);
double
gaussZiggurat
(
double
mean
,
double
variance
);
void
tableNor
(
unsigned
long
seed
);
void
tableNor
(
unsigned
long
seed
);
...
...
openair2/UTIL/MATH/random.c
deleted
100644 → 0
View file @
e695f242
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*
random.c
-------------------
AUTHOR : Lionel GAUTHIER
COMPANY : EURECOM
EMAIL : Lionel.Gauthier@eurecom.fr
***************************************************************************/
#include "rtos_header.h"
#include "platform_types.h"
#include <sys/time.h>
/* Random generators */
#define FACTOR 16807
#define LASTXN 127773
#define UPTOMOD -2836
static
int
seed
;
void
init_uniform
(
void
)
{
struct
timeval
tv
;
struct
timezone
tz
;
gettimeofday
(
&
tv
,
&
tz
);
seed
=
(
int
)
tv
.
tv_usec
;
#ifdef NODE_MT
#warning TO DO seed = mobileId
//seed += mobileId;
#endif
#ifdef NODE_RG
#warning TO DO seed = rgId
//seed += rgId;
#endif
}
int
uniform
(
void
)
{
static
int
times
,
rest
,
prod1
,
prod2
;
times
=
seed
/
LASTXN
;
rest
=
seed
-
times
*
LASTXN
;
prod1
=
times
*
UPTOMOD
;
prod2
=
rest
*
FACTOR
;
seed
=
prod1
+
prod2
;
return
seed
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment