gpt4 book ai didi

c - 修改 PHP rand 函数

转载 作者:行者123 更新时间:2023-12-02 02:09:40 25 4
gpt4 key购买 nike

出于测试和学习目的,我想修改 https://github.com/php/php-src 中的 php randmt_rand 函数:ext/standard/rand.c.

我想在每次调用 rand 函数时给出一个固定的输出,为此我修改了代码

PHPAPI long php_rand(TSRMLS_D)
{
long ret;

if (!BG(rand_is_seeded)) {
php_srand(GENERATE_SEED() TSRMLS_CC);
}

#ifdef ZTS
ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
ret = random();
# elif defined(HAVE_LRAND48)
ret = lrand48();
# else
ret = rand();
# endif
#endif

// ignoring the results coming from the calls above and
// returning a constant value
ret = 3264;

return ret;
}

已编译

./configure
make
make install

最后将 rand 函数调用为 echo rand(3000,4000);,它总是返回 3000

修改这个函数的方法是什么?为什么有 TSRMLS_D 但没有范围参数?

最佳答案

从 PHP 调用的实际函数是声明的函数 PHP_FUNCTION(rand) ,它调用了 php_rand()您修改的功能。它执行以下操作:

PHP_FUNCTION(rand)
{
long min;
long max;
long number;
int argc = ZEND_NUM_ARGS();

if (argc != 0 && zend_parse_parameters(argc TSRMLS_CC, "ll", &min, &max) == FAILURE)
return;

number = php_rand(TSRMLS_C);
if (argc == 2) {
RAND_RANGE(number, min, max, PHP_RAND_MAX);
}

RETURN_LONG(number);
}

如您所见,如果您传入 2 个参数,它会调用 RAND_RANGE宏,它将 php_rand() 的结果转换为给定的范围。

#define RAND_RANGE(__n, __min, __max, __tmax) \
(__n) = (__min) + (long) ((double) ( (double) (__max) - (__min) + 1.0) * ((__n) / ((__tmax) + 1.0)))

如果您希望它始终输出给定值,我建议修改 PHP_FUNCTION(rand),而不是 php_rand()

虽然如果您要寻找的只是稳定的随机数输出,以便每次都能得到相同的结果,但如果您不关心确切的结果,您可以调用 srand(0)在你的程序开始时,用一个常量值来为随机数生成器播种。这意味着随机数生成器将始终为您提供相同的随机数序列,这对于测试目的很有用,并且可以在不修补 PHP 本身的情况下完成。

关于c - 修改 PHP rand 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13460062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com