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

时间:2012-06-18 17:47:09

标签: php random

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

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

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

是否有更好的获取随机字符的方法

3 个答案:

答案 0 :(得分:2)

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

长答案

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

请注意,无法生成实际随机数,您可能只是增加熵。但在大多数情况下,这就够了......

答案 1 :(得分:1)

  • 不需要将字符串洗牌并从中选择随机索引。你不会以这种方式获得任何额外的随机性。
  • 几乎所有目的,rand()都会很好,你永远不会遇到问题。如果你真的不能容忍它,mt_rand()会更好,就像Somnath所说的那样。
  • 或者,HotBitsRandom.org等服务可以让您以速度/有限请求为代价访问真正随机的值。但是,这几乎肯定不是必要的。

答案 2 :(得分:-1)

使用mt_rand()

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

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

许多旧libcs​​的随机数生成器有可疑或未知   特点而且很慢。默认情况下,PHP使用libc随机   带有rand()函数的数字生成器。 mt_rand()函数是一个   直接替代这个。它使用随机数生成器   已知的特征使用»Mersenne Twister,将会   产生随机数比平均libc快四倍   rand()提供。

     

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

并且不需要str_shuffle。 mt_rand在随机数之间进行随机播放。

来源:

  1. a method of selecting random characters from given string
  2. http://maymay.net/blog/2004/12/19/generating-random-letters-in-php/