From: Sterling Hughes Date: Sun, 7 Oct 2001 11:52:09 +0000 (+0000) Subject: @ Have rand() and mt_rand() seed automatically if srand() or mt_srand() has X-Git-Tag: PRE_PARAMETER_PARSING_API~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a50a0322fbea3ebaf795cd730e1e6cc6798d72b;p=php @ Have rand() and mt_rand() seed automatically if srand() or mt_srand() has @ not been called. (Sterling) --- diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index 89bfe7af4e..27d9cf472c 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -174,7 +174,10 @@ typedef struct { php_uint32 *next; /* next random value is computed from here */ int left; /* can *next++ this many times before reloading */ - unsigned int rand_seed; /* Seed for rand() */ + unsigned int rand_seed; /* Seed for rand(), in ts version */ + + zend_bool rand_is_seeded; /* Whether rand() has been seeded */ + zend_bool mt_rand_is_seeded; /* Whether mt_rand() has been seeded */ /* syslog.c */ int syslog_started; diff --git a/ext/standard/rand.c b/ext/standard/rand.c index e7cbac399d..e55ca7a6fd 100644 --- a/ext/standard/rand.c +++ b/ext/standard/rand.c @@ -198,7 +198,7 @@ PHPAPI void php_mt_srand(php_uint32 seed TSRMLS_DC) register php_uint32 x = (seed | 1U) & 0xFFFFFFFFU, *s = BG(state); register int j; - + for (BG(left) = 0, *s++ = x, j = N; --j; *s++ = (x *= 69069U) & 0xFFFFFFFFU); } @@ -268,6 +268,7 @@ PHP_FUNCTION(srand) seed = GENERATE_SEED(); php_srand(seed TSRMLS_CC); + BG(rand_is_seeded) = 1; } /* }}} */ @@ -284,6 +285,7 @@ PHP_FUNCTION(mt_srand) seed = GENERATE_SEED(); php_mt_srand(seed TSRMLS_CC); + BG(mt_rand_is_seeded) = 1; } /* }}} */ @@ -328,8 +330,11 @@ PHP_FUNCTION(rand) if (argc != 0 && zend_parse_parameters(argc TSRMLS_CC, "ll", &min, &max) == FAILURE) return; - number = php_rand(TSRMLS_C); + if (!BG(rand_is_seeded)) { + php_srand(GENERATE_SEED() TSRMLS_CC); + } + number = php_rand(TSRMLS_C); if (argc == 2) { RAND_RANGE(number, min, max, PHP_RAND_MAX); } @@ -350,6 +355,10 @@ PHP_FUNCTION(mt_rand) if (argc != 0 && zend_parse_parameters(argc TSRMLS_CC, "ll", &min, &max) == FAILURE) return; + if (!BG(mt_rand_is_seeded)) { + php_mt_srand(GENERATE_SEED() TSRMLS_CC); + } + /* * Melo: hmms.. randomMT() returns 32 random bits... * Yet, the previous php_rand only returns 31 at most.