2

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

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

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

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

4

3 回答 3

2

简短的回答:不,那很好。

长答案

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

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

于 2012-06-18T17:55:35.420 回答
1
  • 无需对字符串进行洗牌并从中选择随机索引。通过这种方式,您不会获得任何额外的随机性。
  • 对于几乎所有目的,rand()它会很好,你永远不会遇到问题。如果你真的不能忍受,那就mt_rand()更好了,就像 Somnath 建议的那样。
  • 或者,HotBitsRandom.org等服务可以让您访问真正随机的值,但会以速度/有限请求为代价。然而,这几乎可以肯定是没有必要的。
于 2012-06-18T17:58:04.500 回答
-1

使用mt_rand(),

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

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

许多旧 libcs​​ 的随机数生成器具有可疑或未知的特性并且速度很慢。默认情况下,PHP 使用带有 rand() 函数的 libc 随机数生成器。mt_rand() 函数是它的替代品。它使用具有已知特性的随机数生成器,使用 » Mersenne Twister,生成随机数的速度比 libc rand() 提供的平均速度快四倍。

如果在没有可选最小值的情况下调用,最大参数 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/
于 2012-06-18T17:53:00.280 回答