summaryrefslogtreecommitdiff
path: root/newlib/libc/stdlib/rand.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdlib/rand.c')
-rw-r--r--newlib/libc/stdlib/rand.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/newlib/libc/stdlib/rand.c b/newlib/libc/stdlib/rand.c
new file mode 100644
index 00000000000..3d739efbcff
--- /dev/null
+++ b/newlib/libc/stdlib/rand.c
@@ -0,0 +1,86 @@
+/*
+FUNCTION
+<<rand>>, <<srand>>---pseudo-random numbers
+
+INDEX
+ rand
+INDEX
+ srand
+INDEX
+ rand_r
+
+ANSI_SYNOPSIS
+ #include <stdlib.h>
+ int rand(void);
+ void srand(unsigned int <[seed]>);
+ int rand_r(unsigned int *<[seed]>);
+
+TRAD_SYNOPSIS
+ #include <stdlib.h>
+ int rand();
+
+ void srand(<[seed]>)
+ unsigned int <[seed]>;
+
+ void rand_r(<[seed]>)
+ unsigned int *<[seed]>;
+
+
+DESCRIPTION
+<<rand>> returns a different integer each time it is called; each
+integer is chosen by an algorithm designed to be unpredictable, so
+that you can use <<rand>> when you require a random number.
+The algorithm depends on a static variable called the ``random seed'';
+starting with a given value of the random seed always produces the
+same sequence of numbers in successive calls to <<rand>>.
+
+You can set the random seed using <<srand>>; it does nothing beyond
+storing its argument in the static variable used by <<rand>>. You can
+exploit this to make the pseudo-random sequence less predictable, if
+you wish, by using some other unpredictable value (often the least
+significant parts of a time-varying value) as the random seed before
+beginning a sequence of calls to <<rand>>; or, if you wish to ensure
+(for example, while debugging) that successive runs of your program
+use the same ``random'' numbers, you can use <<srand>> to set the same
+random seed at the outset.
+
+RETURNS
+<<rand>> returns the next pseudo-random integer in sequence; it is a
+number between <<0>> and <<RAND_MAX>> (inclusive).
+
+<<srand>> does not return a result.
+
+NOTES
+<<rand>> and <<srand>> are unsafe for multi-thread applications.
+<<rand_r>> is MT-Safe and should be used instead.
+
+
+PORTABILITY
+<<rand>> is required by ANSI, but the algorithm for pseudo-random
+number generation is not specified; therefore, even if you use
+the same random seed, you cannot expect the same sequence of results
+on two different systems.
+
+<<rand>> requires no supporting OS subroutines.
+*/
+
+#ifndef _REENT_ONLY
+
+#include <stdlib.h>
+#include <reent.h>
+
+void
+_DEFUN (srand, (seed), unsigned int seed)
+{
+ _REENT->_new._reent._rand_next = seed;
+}
+
+int
+_DEFUN_VOID (rand)
+{
+ return ((_REENT->_new._reent._rand_next =
+ _REENT->_new._reent._rand_next * 1103515245 + 12345 )
+ & RAND_MAX );
+}
+
+#endif /* _REENT_ONLY */