awk: Use random(3) instead of rand(3)

While none of them is considered even near to cryptographic
level, random(3) is a better random generator than rand(3).

Use random(3) for awk as is done in other systems.

Thanks to Chenguang Li for discussing this in the lists
and submitting the patch upstream.

PR:		193147
MFC after:	5 weeks
This commit is contained in:
pfg 2014-09-19 18:24:02 +00:00
parent b209580418
commit c3674dfb67
3 changed files with 7 additions and 5 deletions

View File

@ -208,7 +208,7 @@ or of
if no argument.
.TP
.B rand
random number on (0,1)
random number on [0,1)
.TP
.B srand
sets seed for

View File

@ -74,7 +74,7 @@ int main(int argc, char *argv[])
signal(SIGFPE, fpecatch);
srand_seed = 1;
srand(srand_seed);
srandom((unsigned long) srand_seed);
yyin = NULL;
symtab = makesymtab(NSYMTAB/NSYMTAB);

View File

@ -1521,8 +1521,10 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
u = (Awkfloat) system(getsval(x)) / 256; /* 256 is unix-dep */
break;
case FRAND:
/* in principle, rand() returns something in 0..RAND_MAX */
u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX;
/* random() returns numbers in [0..2^31-1]
* in order to get a number in [0, 1), divide it by 2^31
*/
u = (Awkfloat) random() / (0x7fffffffL + 0x1UL);
break;
case FSRAND:
if (isrec(x)) /* no argument provided */
@ -1530,7 +1532,7 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
else
u = getfval(x);
tmp = u;
srand((unsigned int) u);
srandom((unsigned long) u);
u = srand_seed;
srand_seed = tmp;
break;