mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 14:21:10 +02:00
(Random): New text about the default random state,
following suggestions by Stephen Uitti.
This commit is contained in:
parent
4b26c03ec7
commit
8c726cf0b4
3 changed files with 46 additions and 0 deletions
1
THANKS
1
THANKS
|
@ -85,6 +85,7 @@ For fixes or providing information which led to a fix:
|
||||||
Issac Trotts
|
Issac Trotts
|
||||||
Greg Troxel
|
Greg Troxel
|
||||||
Aaron M. Ucko
|
Aaron M. Ucko
|
||||||
|
Stephen Uitti
|
||||||
Momchil Velikov
|
Momchil Velikov
|
||||||
Panagiotis Vossos
|
Panagiotis Vossos
|
||||||
Neil W. Van Dyke
|
Neil W. Van Dyke
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2008-02-11 Neil Jerram <neil@ossau.uklinux.net>
|
||||||
|
|
||||||
|
* api-data.texi (Random): New text about the default random state,
|
||||||
|
following suggestions by Stephen Uitti.
|
||||||
|
|
||||||
2008-02-01 Neil Jerram <neil@ossau.uklinux.net>
|
2008-02-01 Neil Jerram <neil@ossau.uklinux.net>
|
||||||
|
|
||||||
* api-scheduling.texi (Threads): Add "C Function scm_join_thread"
|
* api-scheduling.texi (Threads): Add "C Function scm_join_thread"
|
||||||
|
|
|
@ -1733,6 +1733,46 @@ The global random state used by the above functions when the
|
||||||
@var{state} parameter is not given.
|
@var{state} parameter is not given.
|
||||||
@end defvar
|
@end defvar
|
||||||
|
|
||||||
|
Note that the initial value of @code{*random-state*} is the same every
|
||||||
|
time Guile starts up. Therefore, if you don't pass a @var{state}
|
||||||
|
parameter to the above procedures, and you don't set
|
||||||
|
@code{*random-state*} to @code{(seed->random-state your-seed)}, where
|
||||||
|
@code{your-seed} is something that @emph{isn't} the same every time,
|
||||||
|
you'll get the same sequence of ``random'' numbers on every run.
|
||||||
|
|
||||||
|
For example, unless the relevant source code has changed, @code{(map
|
||||||
|
random (cdr (iota 30)))}, if the first use of random numbers since
|
||||||
|
Guile started up, will always give:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(map random (cdr (iota 19)))
|
||||||
|
@result{}
|
||||||
|
(0 1 1 2 2 2 1 2 6 7 10 0 5 3 12 5 5 12)
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
To use the time of day as the random seed, you can use code like this:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(let ((time (gettimeofday)))
|
||||||
|
(set! *random-state*
|
||||||
|
(seed->random-state (+ (car time)
|
||||||
|
(cdr time)))))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
And then (depending on the time of day, of course):
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(map random (cdr (iota 19)))
|
||||||
|
@result{}
|
||||||
|
(0 0 1 0 2 4 5 4 5 5 9 3 10 1 8 3 14 17)
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
For security applications, such as password generation, you should use
|
||||||
|
more bits of seed. Otherwise an open source password generator could
|
||||||
|
be attacked by guessing the seed@dots{} but that's a subject for
|
||||||
|
another manual.
|
||||||
|
|
||||||
|
|
||||||
@node Characters
|
@node Characters
|
||||||
@subsection Characters
|
@subsection Characters
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue