• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Huangsir
博客园    首页    新随笔    联系   管理    订阅  订阅
按概率排序

  大概的起因是需要一个有有概率的东西。打个比方 A:B = 4:1,即A出现的概率是B出现的概率的4倍。如果随机1亿次,命中A的概率是B的4被,也就是说A应该占8kw左右,B应该占2kw左右,就对了。但是其实也没有那么研究,就是单单的希望A的次数能比B的多就行。

  网上很多转来转去的方法,基本原理都是构造一个线段,权值高的线段长度就长,权值低的长度就短,然后在线段上平均撒点,看落在哪就是哪。

  这个方法原理很简单,一开始我也是这么想的,但是写着写着就觉得很二,想换一个方法。终于在一天晚上洗澡的时候灵光一闪~~

  其实我真正的需求,不是需要按概率的随机数。而是有一个数组,数组里面有一堆元素,这堆元素都有自己的权值,我要按这些权值对这个数组进行重新排序,使得权值高的元素排在前面的概率,比权值低的要大。

  比如说有一个数组[a,b],权值分别是1,2。经过排序后,数组变成[b,a]的概率是变成[a,b]的概率的2倍。

  好吧,原理也很简单,就是在权值上做手脚。我在旧的权值上乘与random(1,x),成为新的权值。然后对整个数组做快排,得到的新数组就是我想要的数组。(x指的是一个比较大的数,这个数大于大于数组长度,比如说1w,10w,1kw等等)。

  当然我依靠php实现的,具体耗时没测过,理论上应该比较接近快排,反正蛮快就行。而且代码简短,我喜欢...

//array(key=>'内容',value=>'权值')
$arr = array('A' => 3, 'B' => 5, 'C' => 1, 'D' => 6);
var_dump(hurry_sort($arr));

function hurry_sort ($array)
{
foreach ($array as $k => $v)
{
$array[$k] = $v * mt_rand(1, 1000);
}
arsort($array, SORT_NUMERIC);
return array_keys($array);
}

posted on 2011-09-20 15:13  huangsir  阅读(830)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3