summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-12-18 18:00:45 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2016-12-18 18:00:45 +0100
commit4f72cda4acaa92dfaddb29891d86efeea990e030 (patch)
tree7ab5e3aa3dde5f78012a372c7809f6fe26adf312
parent2830cd7eb6182eb7bc42e10557a160156649859c (diff)
downloadplan9front-4f72cda4acaa92dfaddb29891d86efeea990e030.tar.xz
awk: improve random number generation
don't use rand() and scale it to 0..1, instead call native frand() which produces uniform random number. instead of seeding the rng with time(0), use truerand().
-rw-r--r--sys/src/cmd/awk/run.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/sys/src/cmd/awk/run.c b/sys/src/cmd/awk/run.c
index 6627f661c..213fb25ba 100644
--- a/sys/src/cmd/awk/run.c
+++ b/sys/src/cmd/awk/run.c
@@ -29,10 +29,6 @@ THIS SOFTWARE.
#include "awk.h"
#include "y.tab.h"
-#ifndef RAND_MAX
-#define RAND_MAX 32767 /* all that ansi guarantees */
-#endif
-
jmp_buf env;
extern int pairstack[];
@@ -1582,12 +1578,11 @@ Cell *bltin(Node **a, int) /* builtin functions. a[0] is type, a[1] is arg list
u = (Awkfloat) system(getsval(x));
break;
case FRAND:
- /* in principle, rand() returns something in 0..RAND_MAX */
- u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX;
+ u = frand();
break;
case FSRAND:
if (isrec(x)) /* no argument provided */
- u = time(nil);
+ u = (Awkfloat) (truerand() >> 1);
else
u = getfval(x);
srand((unsigned int) u);