php - 概率算法排序
过去多啦不再A梦
过去多啦不再A梦 2017-05-24 11:33:58
0
2
672

根据概率对数据进行排序,如何让每个概率区间都有结果?

举例如下,假设有一组数据如下

{ a: 40, b: 20, c: 10, d: 5, e: 5, f: 5, g: 5, h: 5, i: 3, j: 2 }

key为要排序的值,value为每个值出现在数组该位置的概率,比如a,出现在数组0位置的概率为40%,也就是算出来的数组中,a有40%的机会展示在数组的第一位,然后剩下的依次根据概率进行算法排序。

我目前的解决方法(Low的办法,而且不能随着数组的扩大而继续支持):
1、根据现有的概率进行区间划分,假设a的区间为0-40,b为40-60,c为60-70,以此类推
2、利用函数获得1-100区间的随机数,然后将结果进行丢弹(也就是放在对应的区间中)

代码如下(求优化思路)

public function getRandValue($rate, $max, $min, $arr) { while (count($rate)) { $rand = $this->getRand($min, $max); if (0 < $rand && $rand <= 40) { $num = 40; } else if (40 < $rand && $rand <= 60) { $num = 20; } else if (60 < $rand && $rand <= 70) { $num = 10; } else if (70 < $rand && $rand <= 75) { $num = 5; } else if (75 < $rand && $rand <= 80) { $num = 5; } else if (80 < $rand && $rand <= 85) { $num = 5; } else if (85 < $rand && $rand <= 90) { $num = 5; } else if (90 < $rand && $rand <= 95) { $num = 5; } else if (95 < $rand && $rand <= 98) { $num = 3; } else if (98 < $rand && $rand <= 100) { $num = 2; } if (!in_array($num, $arr) && in_array($num, array(40, 20, 10, 3, 2))) { $arr[] = $num; } elseif (!in_array($num, array(40, 20, 10, 3, 2))) { $arr[] = $num; } if (count($arr) >= 10) { break; } } return $arr; }

遇到的问题:(in_array判断是有因为这几个区间的值只能算出来一次)
1、算出来的值不一定每个区间的值都有
2、代码没有可扩展性

还望大家指点指点,请指教,感谢各位!

过去多啦不再A梦
过去多啦不再A梦

全部回复 (2)
黄舟

我觉得这个问题有问题,这样的输入甚至不能保证满足条件的分布是存在的。

{a: 60, b: 40}为例:全排列的空间是{ab, ba}。那么根据你的定义应该有:

a出现在位置0的概率为60%,所以 P(ab) = 0.6 且 b出现在位置1的概率为40%,所以 P(ab) = 0.4
    我想大声告诉你

    跟我写的一个样 = = 我也想知道怎么扩展

      最新下载
      更多>
      网站特效
      网站源码
      网站素材
      前端模板
      关于我们 免责声明 Sitemap
      PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!