【问题标题】:Better way to select "real random" char from string从字符串中选择“真正随机”字符的更好方法
【发布时间】:2012-06-18 17:47:08
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么觉得不够?
  • 只要你没有真正的随机源,比如放射性衰变,你所能得到的只是伪随机。您可能对random.org 感兴趣。
  • “任何考虑产生随机数字的算术方法的人当然都处于一种罪恶状态。” ——约翰·冯·诺依曼
  • 更好的方法,确切地说。哪个统计测试?你的 rand() 是种子吗?你需要多少熵?你能提供多少?一个人很容易做很多事情,结果比你现在的情况更糟。

标签: php random


【解决方案1】:

简答:不,没关系。

长答案

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

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

【讨论】:

  • 从技术上讲,mt_rand() 是免费的改进,如果没有其他原因,只是将获得一分钟的速度提升。
  • 根据我的阅读,mt_rand() 并不是随机化方面的改进,只是性能。它还会生成伪随机数。
  • Boris:在没有 /dev/urandom 池的 Windows 机器上会发生什么?
  • @Francisc,遗憾的是它不会像文档中所说的那样工作。
  • @Francisc:将它们结合起来不会显着增加“随机性”——还不如只使用一个。
【解决方案2】:
  • 没有必要同时打乱字符串并从中选择一个随机索引。通过这种方式,您不会获得任何额外的随机性。
  • 对于几乎所有用途,rand() 会很好,您永远不会遇到问题。如果你真的无法忍受,mt_rand() 会更好,正如 Somnath 所建议的那样。
  • 或者,HotBitsRandom.org 等服务可以让您访问真正随机的值,但代价是速度/请求有限。然而,这几乎可以肯定是没有必要的。

【讨论】:

    【解决方案3】:

    使用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() 提供。

    如果调用时没有可选的最小值,最大值参数 mt_rand() 返回一个 介于 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/

    【讨论】:

    • 注意:mt_rand() 并没有实际上提供比最近的 libc rand() 更随机的结果 - 它只是提供了更一致的结果平台,并且可能会更快一些。还要注意警告 - “当最大值超过 2^32 时,mt_rand() 返回值的分布在 PHP 的 64 位版本上偏向偶数。”
    • 看过很多类似的帖子,一直想知道/询问有没有办法将生成的随机字符串记录/保存到文件,然后重新执行时检查是否存在剧本?并且IF 它存在(这将是相当罕见的),不保存到文件并生成新的随机序列。
    • 随机查找是随机的。这不可能是好的,更好的,最好的。只需选择具有随机值的东西即可。
    • @dimo414 我只是好奇,谢谢。我基本上是在新水域游泳。我不是网络新手,但就 PHP 和 sha1 以及其他类型的哈希而言,对我来说还是很新的。
    • @Fred,不用担心,这是一个合理的问题。有很多方法可以生成任意的唯一值(另一种很酷的方法是 MongoDB's _id object),但 sha1 可能最容易实现,而且效果很好。
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多