Embedded Artistry libc
C Standard Library Support for Bare-metal Systems
rand.c
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 1990, 1993
3  * The Regents of the University of California. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * Posix rand_r function added May 1999 by Wes Peters <wes@softweyr.com>.
30  */
31 
32 #include <stdlib.h>
33 
34 static unsigned long next = 1;
35 static int do_rand(unsigned long* ctx)
36 {
37 #ifdef USE_WEAK_SEEDING
38  /*
39  * Historic implementation compatibility.
40  * The random sequences do not vary much with the seed,
41  * even with overflowing.
42  */
43  return ((*ctx = *ctx * 1103515245 + 12345) % ((unsigned long)RAND_MAX + 1));
44 #else /* !USE_WEAK_SEEDING */
45  /*
46  * Compute x = (7^5 * x) mod (2^31 - 1)
47  * without overflowing 31 bits:
48  * (2^31 - 1) = 127773 * (7^5) + 2836
49  * From "Random number generators: good ones are hard to find",
50  * Park and Miller, Communications of the ACM, vol. 31, no. 10,
51  * October 1988, p. 1195.
52  */
53  long hi, lo, x;
54 
55  /* Can't be initialized with 0, so use another value. */
56  if(*ctx == 0)
57  {
58  *ctx = 123459876;
59  }
60  hi = *ctx / 127773;
61  lo = *ctx % 127773;
62  x = 16807 * lo - 2836 * hi;
63  if(x < 0)
64  {
65  x += 0x7fffffff;
66  }
67  return (int)((*ctx = (unsigned long)x) % ((unsigned long)RAND_MAX + 1));
68 #endif /* !USE_WEAK_SEEDING */
69 }
70 
71 __attribute__((weak)) int rand_r(unsigned int* ctx)
72 {
73  unsigned long val = (unsigned long)*ctx;
74  int r = do_rand(&val);
75 
76  *ctx = (unsigned int)val;
77  return (r);
78 }
79 
80 __attribute__((weak)) int rand()
81 {
82  return (do_rand(&next));
83 }
84 
85 __attribute__((weak)) void srand(unsigned seed)
86 {
87  next = seed;
88 }
int rand_r(unsigned int *ctx)
static int do_rand(unsigned long *ctx)
Definition: rand.c:35
int rand(void)
Returns a pseudo-random integer value between ​0​ and.
__attribute__((weak))
Definition: rand.c:71
static unsigned long next
Definition: rand.c:34
#define RAND_MAX
Definition: stdlib.h:51
void srand(unsigned seed)
Seeds the pseudo-random number generator used by.