从字符串中选择“真正的随机”字符的更好方法


Better way to select "real random" char from string

我正在使用它从字符串池中获取随机字符:

$charset=str_shuffle('./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789');
$charsetLength=strlen($charset)-1;
$chosen=$charset[rand(0,$charsetLength)];

兰德和str_shuffle函数产生伪随机结果。

有没有更好的方法来获取随机字符

简短的回答:不,这完全没问题。

长答案

如果你真的需要生成(伪)随机字符串,你可以看看 mcrypt 扩展名并将mcrypt_create_iv()/dev/urandom 一起使用,你可以按原样使用二进制生成的种子或将其转换为 base64 以获得 ascii 表示。

请注意,没有办法生成真正的随机数,您可能只会增加熵。但在大多数情况下,这就足够了...

  • 无需打乱字符串并从中选择一个随机索引。 通过这种方式,您不会获得任何额外的随机性。
  • 对于几乎所有目的,rand()都会很好,您永远不会遇到问题。 如果你真的不能忍受它,mt_rand()更好,正如索姆纳特所建议的那样。
  • 或者,HotBits或 Random.org 等服务可以让您访问真正的随机值,但代价是速度/有限的请求。 然而,这几乎肯定是没有必要的。

使用 mt_rand()

您可以通过以下方式获取随机字符的索引:

$charIndex = mt_rand(0, strlen($string));
$char = $string[$charIndex]; // or substr($string, $charIndex, 1)

旧 libc 的许多随机数生成器具有可疑或未知 特征和缓慢。默认情况下,PHP 使用 libc 随机数 带有 rand() 函数的数字生成器。mt_rand() 函数是一个 直接替换此。它使用随机数生成器 使用»梅森龙卷风的已知特性,它将 产生随机数的速度比平均 libc 快四倍 兰德() 提供。

如果在没有可选的 min 的情况下调用,则 max 参数 mt_rand() 返回 介于 0 和 mt_getrandmax() 之间的伪随机值。如果你想要一个 介于 5 和 15(含)之间的随机数,例如,使用 mt_rand(5,15)。

无需str_shuffle,mt_rand确实会在随机数之间洗牌。

源:

  1. 一种从给定字符串中选择随机字符的方法
  2. http://maymay.net/blog/2004/12/19/generating-random-letters-in-php/