【问题标题】:getrandmax() why 32767 limitiation on windows?盛大的 max() 为什么 32767 限制在 Windows 上?
【发布时间】:2012-02-12 10:53:33
【问题描述】:

PHP 在 windows 上返回最大可能的随机值 32767?

什么是windows的约束?

echo getrandmax(); //32767

【问题讨论】:

  • rand 调用了一个可以追溯到方舟的系统 rand 函数——或者至少在大多数小型计算机具有 16 位字长的时候。如果您想要一个更好的随机数生成器,请使用 Mersenne Twister 之一:mt_rand()。它的 mt_getrandmax() 是 2^31-1。
  • 或者更确切地说,它是最大的种子。在 1 到 250000 或 1 到 10 亿之间只有 32767 个不同的随机值,这是相当愚蠢的。 (这就是 Mersenne Twister 的用武之地!)

标签: php random


【解决方案1】:

根据 PHP 源代码,getrandmax() 定义为:

PHP_FUNCTION(getrandmax)
{
    if (zend_parse_parameters_none() == FAILURE) {
        return;
    }

    RETURN_LONG(PHP_RAND_MAX);
}

PHP_RAND_MAX 定义为:

#define PHP_RAND_MAX RAND_MAX

RAND_MAX 本身被定义为:

/* System Rand functions */
#ifndef RAND_MAX
#define RAND_MAX (1<<15)
#endif

因此,如果定义了RAND_MAX,则使用它...


...而且,在带有 Visual Studio 的 Windows 上,确实有一个 RAND_MAX 定义(引用)

常量RAND_MAX是可以返回的最大值 rand 函数。 RAND_MAX 定义为值0x7fff

所以,基本上,getrandmax() 返回32767,因为这就是它在 Windows 上的定义方式——而 PHP 经常使用底层系统导出的内容。

【讨论】:

  • 被时间打败了。我只是在看源码
猜你喜欢
  • 2020-09-19
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2017-09-19
  • 2019-01-21
相关资源
最近更新 更多