大概的起因是需要一个有有概率的东西。打个比方 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);
}