楼上的回答全都会错意了,题主意思是根据权重设定随机几率,例如 A 的权重为10,B 的权重为 5,这个时候随机出现 A 的几率要比出现 B 的几率高。
你可以试试这个备选方案。
就是先取出权重列表再去根据权重随机出来的那个权重值,根据权重值去库里再随机查。
/**
* Roll
*/
if (!function_exists('roll')) {
function roll($data, $key = 'weight')
{
$weight = 0;
$tempData = [];
foreach ($data as $one) {
$weight += $one[$key];
for ($i = 0; $i < $one[$key]; $i++) {
$tempData[] = $one;
}
}
$use = rand(0, $weight - 1);
return $tempData[$use];
}
}
$data = [['weight' => 1],
['weight' => 3],
['weight' => 5],
['weight' => 7],
['weight' => 9]];
$result = roll($data)['weight'];
SELECT * FROM database WHERE id >= (
(SELECT MAX(id) FROM database WHERE b = $result) - (SELECT MIN(id) FROM database WHERE b = $result)
) * RAND() + (SELECT MIN(id) FROM database WHERE b = $result) AND b = $result LIMIT 1