【问题标题】:PHP Random value in array ponderated [duplicate]考虑的数组中的PHP随机值[重复]
【发布时间】:2017-04-15 10:20:20
【问题描述】:

我有以下脚本:

$domain = ['gmail.com', 'yahoo.com', 'hotmail.com'];
$domain = $domain[mt_rand(0, count($domain) - 1)];

可以根据被选中的机会为每个项目设置一个百分比值。 例如,我希望有 75% 的机会拥有 $domain='gmail.com';。

【问题讨论】:

  • $i = mt_rand(0,100); if ($i<75) $domain = $domain[0];
  • 它使用 Mersenne Twister 算法。如果您需要定制一个,为什么不创建一个?
  • $domain = ['gmail.com','gmail.com','gmail.com','gmail.com','yahoo.com','hotmail.com']; 4:2现在有更多机会获得gmail。只是一个棘手而不是正确的方法。

标签: php arrays random


【解决方案1】:

有很多方法可以达到预期的效果。

我的方法不要求总“机会”为 100;您可以自行决定最高键的值。

我的方法的基础是结果($domain)将是具有不大于随机数($pick)的最低键的数组值。

这是一个例子,让 gmail 有 75% 的机会,而 yahoo 和 hotmail 的机会与剩下的 25% 相同。

*请注意,mt_rand() 以 1 开头,而不是问题下的 0。

$domain_perc=array(
    750=>'gmail.com',    // between 1 & 750 = 75% chance
    875=>'yahoo.com',    // between 751 & 875 = 12.5% chance
    1000=>'hotmail.com'  // between 876 & 1000 = 12.5% chance
);

$pick=mt_rand(1,max(array_keys($domain_perc)));

foreach($domain_perc as $p=>$v){
    if($pick<=$p){
        $domain=$v;
        break;
    }
}

或者你可以用这个单行替换foreach()代码块:

$domain=current(array_filter($domain_perc,function($v,$k)use($pick){return $pick<=$k;},ARRAY_FILTER_USE_BOTH));

至于自定义输入数组,表达 50%-25%-25% 拆分的简单方法是:

$domain_perc=array(
    2=>'gmail.com',    // 1 and 2 of 4 = 50% chance
    3=>'yahoo.com',    // 3 of 4 = 25% chance
    4=>'hotmail.com'   // 4 of 4 = 25% chance
);

要设置一个具有 ~33% -vs- ~66% 拆分的二值数组:

$domain_perc=array(
    1=>'gmail.com',    // 1 of 3 = ~33% chance
    3=>'yahoo.com'     // 2 & 3 of 3 = ~66% chance
);

【讨论】:

  • 抱歉我的回复晚了。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2019-03-20
  • 2023-03-15
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2023-04-03
相关资源
最近更新 更多