【问题标题】:PHP: Better than array_rand() [Q&A]PHP:优于 array_rand() [Q&A]
【发布时间】:2014-11-06 02:41:24
【问题描述】:

array_rand() 有时不够好。

虽然我知道它返回的是键而不是值,但我发现它的名称不清楚。

但最重要的是,array_rand() 并没有给所有键提供相同的机会(如 Array_rand does not shuffleArray_rand not random 以及许多其他示例所示)。

更好地随机化数组的一个值得注意的方法是函数shuffle(),但它可能对资源要求很高,而且如果键很重要,它们也会随之丢失。

对于那个稍微笨拙的功能,有什么更好更快的替代方法?

【问题讨论】:

  • 您能否详细说明您在array_rand() 中看到的缺点?你的意思是不给平等机会?
  • 洗牌不需要太多要求:Fisher-Yates 只需要处理请求数量的项目,而不是整个数组。如果事实证明内置的shuffle()“资源要求太高”,则可以针对特定任务正确实施。
  • FWIW,见 here - 从 PHP 7.1 开始,array_rand() 几乎不需要再改进了。

标签: php arrays function random


【解决方案1】:

我想出了这两个函数:

function random_key($array){
    $keys=array_keys($array);
    return $keys[mt_rand(0, count($keys) - 1)];
}

function random_value($array){
    $values=array_values($array);
    return $values[mt_rand(0, count($values) - 1)];
}

它们都适用于任何类型的数组,不改变原始数组,提供更真实的随机结果,并且它们的名称是自我描述的。

主要缺点是与array_rand相反,它们只能给出一个元素。

(得到How to get random value out of an array的答复)

【讨论】:

  • 回答自己的问题并不理想。您应该使用这些示例更新您的问题,并要求输入完全删除此问题。
  • 回答你自己的问题没有错:stackoverflow.com/help/self-answer
【解决方案2】:

我不同意你的说法:

array_rand() 不会给所有键提供相同的机会。

array_rand() 等预定义函数旨在完成它们的用途,但如果您不想依赖它并想使用自己的函数,则可以尝试以下操作:

function array_rand_alternative($array){
  return rand(0,count($array)-1);
}

你可以这样测试这个函数:

$a=[5,2,1,3];
for($i=0;$i<10;$i++)
  echo array_rand_alternative($a).",";

但我仍然建议您使用预定义的函数,因为它们已经过开发人员的充分测试。

【讨论】:

  • rand 最后在 array_rand 给出了相同的结果。
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多