Skip to content

Commit 3a8a408

Browse files
committed
Implement rand_r()
1 parent ea8ffff commit 3a8a408

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

stdlib/SRCFILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ SRCFILES = \
3636
nrand48_r.c \
3737
qsort.c \
3838
rand.c \
39+
rand_r.c \
3940
random.c \
4041
secure-getenv.c \
4142
seed48.c \

stdlib/rand_r.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* Reentrant random function from POSIX.1c.
2+
Copyright (C) 1996-2023 Free Software Foundation, Inc.
3+
This file is part of the GNU C Library.
4+
5+
The GNU C Library is free software; you can redistribute it and/or
6+
modify it under the terms of the GNU Lesser General Public
7+
License as published by the Free Software Foundation; either
8+
version 2.1 of the License, or (at your option) any later version.
9+
10+
The GNU C Library is distributed in the hope that it will be useful,
11+
but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13+
Lesser General Public License for more details.
14+
15+
You should have received a copy of the GNU Lesser General Public
16+
License along with the GNU C Library; if not, see
17+
<https://www.gnu.org/licenses/>. */
18+
19+
#include <stdlib.h>
20+
21+
22+
/* This algorithm is mentioned in the ISO C standard, here extended
23+
for 32 bits. */
24+
int
25+
rand_r (unsigned int *seed)
26+
{
27+
unsigned long next = *seed;
28+
long result;
29+
30+
next *= 1103515245L;
31+
next += 12345;
32+
result = (next / 65536) % 2048;
33+
34+
next *= 1103515245L;
35+
next += 12345L;
36+
result <<= 10;
37+
result ^= (next / 65536) % 1024;
38+
39+
next *= 1103515245L;
40+
next += 12345L;
41+
result <<= 10;
42+
result ^= (next / 65536) % 1024;
43+
44+
*seed = next;
45+
46+
#ifdef __MSHORT__
47+
result &= RAND_MAX;
48+
#endif
49+
return (int) result;
50+
}
51+

0 commit comments

Comments
 (0)