4 changed files with 144 additions and 1 deletions
-
2ext/standard/Makefile.am
-
98ext/standard/lcg.c
-
43ext/standard/php_lcg.h
-
2main/internal_functions.c.in
@ -0,0 +1,98 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP version 4.0 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997, 1998, 1999 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.0 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available at through the world-wide-web at | |
|||
| http://www.php.net/license/2_0.txt. | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Sascha Schumann <ss@2ns.de> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#include "php.h" |
|||
#include "php_lcg.h" |
|||
|
|||
#if HAVE_UNISTD_H |
|||
#include <unistd.h> |
|||
#endif |
|||
|
|||
#ifdef ZTS |
|||
int lcg_globals_id; |
|||
#else |
|||
static php_lcg_globals lcg_globals; |
|||
#endif |
|||
|
|||
/* |
|||
* combinedLCG() returns a pseudo random number in the range of (0,1). |
|||
* The function combines two CGs with periods of |
|||
* 2^31 - 85 and 2^31 - 249. The period of this function |
|||
* is equal to the product of both primes. |
|||
*/ |
|||
|
|||
#define MODMULT(a,b,c,m,s) q = s/a;s=b*(s-a*q)-c*q;if(s<0)s+=m |
|||
|
|||
double php_combined_lcg(void) |
|||
{ |
|||
long q; |
|||
long z; |
|||
LCGLS_FETCH(); |
|||
|
|||
MODMULT(53668,40014,12211,2147483563L, LCG(s1)); |
|||
MODMULT(52774,40692,3791, 2147483399L, LCG(s2)); |
|||
|
|||
z = LCG(s1) - LCG(s2); |
|||
if(z < 1) { |
|||
z += 2147483562; |
|||
} |
|||
|
|||
return z * 4.656613e-10; |
|||
} |
|||
|
|||
static void init_globals(LCGLS_D) |
|||
{ |
|||
LCG(s1) = 1; |
|||
#ifdef ZTS |
|||
LCG(s2) = (long) tsrm_thread_id(); |
|||
#else |
|||
LCG(s2) = (long) getpid(); |
|||
#endif |
|||
} |
|||
|
|||
static int php_minit_lcg(INIT_FUNC_ARGS) |
|||
{ |
|||
#ifdef ZTS |
|||
lcg_globals_id = ts_allocate_id(sizeof(php_lcg_globals), init_globals, NULL); |
|||
#else |
|||
init_globals(); |
|||
#endif |
|||
return SUCCESS; |
|||
} |
|||
|
|||
/* {{{ proto double lcg_value() |
|||
returns a value from the combined linear congruential generator */ |
|||
PHP_FUNCTION(lcg_value) |
|||
{ |
|||
RETURN_DOUBLE(php_combined_lcg()); |
|||
} |
|||
/* }}} */ |
|||
|
|||
static function_entry lcg_functions[] = { |
|||
PHP_FE(lcg_value, NULL) |
|||
{0} |
|||
}; |
|||
|
|||
zend_module_entry lcg_module_entry = { |
|||
"LCG", |
|||
lcg_functions, |
|||
php_minit_lcg, NULL, |
|||
NULL, NULL, |
|||
NULL, |
|||
STANDARD_MODULE_PROPERTIES |
|||
}; |
|||
@ -0,0 +1,43 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP version 4.0 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997, 1998, 1999 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.0 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available at through the world-wide-web at | |
|||
| http://www.php.net/license/2_0.txt. | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Sascha Schumann <ss@2ns.de> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#ifndef PHP_LCG_H |
|||
#define PHP_LCG_H |
|||
|
|||
typedef struct { |
|||
long s1; |
|||
long s2; |
|||
} php_lcg_globals; |
|||
|
|||
double php_combined_lcg(void); |
|||
PHP_FUNCTION(lcg_value); |
|||
|
|||
#ifdef ZTS |
|||
#define LCGLS_D php_lcg_globals *lcg_globals |
|||
#define LCG(v) (lcg_globals->v) |
|||
#define LCGLS_FETCH() php_lcg_globals *lcg_globals = ts_resource(lcg_globals_id) |
|||
#else |
|||
#define LCGLS_D |
|||
#define LCG(v) (lcg_globals.v) |
|||
#define LCGLS_FETCH() |
|||
#endif |
|||
|
|||
extern zend_module_entry lcg_module_entry; |
|||
#define phpext_lcg_ptr &lcg_module_entry |
|||
|
|||
#endif |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue