php按权重分配随机数,PHP两个级别上权重的随机数

我有越来越多的所谓的战斗分组在不同的等级。我想随机显示给用户的战斗。显示率由排名第一的位置(更高的排名 - 更多的印象)和第二层次是从这个排名的收集随机战斗。每一场战斗都有自己的印象。

在$战斗中,我从数据库中获得战斗力,并执行一些计算来定义每个级别应该获得的显示比率和展示次数。

foreach ($battles as $el => &$values) {

$values['show_rate'] = $values['rank'] * 100 / $totals['sum_of_ranks'];

$values['dedicated_impressions'] = $totals['total_battle_impressions'] * $values['show_rate'] / 100;

$values['impressions_left'] = $values['dedicated_impressions'] - $values['sum_of_impressions'];

}这是上一个周期的结果。

在关键的battle_ids中,我拥有这个等级的战斗ID,在battle_impressions中,我也以相同的方式订购了同样的战斗。

$battles = array(

0 => array(

'battles_in_rank' => '1',

'battle_ids' => array(

0 => '28',

),

'battle_impressions' => array(

0 => '3',

),

'sum_of_impressions' => '3',

'rank' => '0',

'show_rate' => 0,

'dedicated_impressions' => 0,

'impressions_left' => -3,

),

1 => array(

'battles_in_rank' => '4',

'battle_ids' => array(

0 => '27',

1 => '19',

2 => '18',

3 => '17',

),

'battle_impressions' => array(

0 => '0',

1 => '0',

2 => '0',

3 => '0',

),

'sum_of_impressions' => '0',

'rank' => '1',

'show_rate' => 6.6666666666667,

'dedicated_impressions' => 230.53333333333,

'impressions_left' => 230.53333333333,

),

2 => array(

'battles_in_rank' => '2',

'battle_ids' => array(

0 => '7',

1 => '3',

),

'battle_impressions' => array(

0 => '0',

1 => '3',

),

'sum_of_impressions' => '3',

'rank' => '3',

'show_rate' => 20,

'dedicated_impressions' => 691.6,

'impressions_left' => 688.6,

),

3 => array(

'battles_in_rank' => '2',

'battle_ids' => array(

0 => '12',

1 => '5',

),

'battle_impressions' => array(

0 => '17',

1 => '1',

),

'sum_of_impressions' => '18',

'rank' => '4',

'show_rate' => 26.666666666667,

'dedicated_impressions' => 922.13333333333,

'impressions_left' => 904.13333333333,

),

4 => array(

'battles_in_rank' => '1',

'battle_ids' => array(

0 => '2',

),

'battle_impressions' => array(

0 => '3434',

),

'sum_of_impressions' => '3434',

'rank' => '7',

'show_rate' => 46.666666666667,

'dedicated_impressions' => 1613.7333333333,

'impressions_left' => -1820.2666666667,

),

);当我得到所有这些信息后,我会进行清理以获得随机函数的好结果。

$elements = array();

$weights = array();

foreach ($battles as $el => &$values) {

$elements[] = array($values['battle_ids'], $values['battle_impressions']);

$weights[] = $values['show_rate'];

}这是我目前的随机功能:

public function getRandom($values, $weights)

{

$pos = mt_rand(1, array_sum($weights));

$em = 0;

foreach ($values as $k => $v) {

$em += $weights[$k];

if ($em >= $pos) {

if (is_array($v)) {

return $this->getRandom($v[0], $v[1]);

} else {

return $v;

}

}

}

}我称之为获得一个随机战斗编号。

$this->getRandom($elements, $weights);我需要的是有5或10个唯一的随机ID。

它的工作原理,但这个功能只给我每个电话的一个随机元素,当我多次呼叫它时,我经常得到相同的ID,如10次中的6次。

例如,如果我需要5次随机战斗,我必须在20-30次迭代的循环中调用该函数,以获得5次独特的随机战斗。如果较高级别的战斗结束了,它应该在阵列中进行较低级别的战斗,所以我总是以5次战斗(或10次)结束。

第二级随机化应该是一个级别上的战斗,由他们的印象加权。这就是为什么随机函数是递归的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值