1

我有一个包含 3 个字段的 MySQL 表,如下所示。

id, name, chance
1001, name1, 1
1002, name2, 3
1003, name3, 1

我想随机选择一条记录 100 次。在 100 次中,我希望记录 id 1001 被选择 20 次(1/5 机会),记录 id 1002 被选择 60 次(3/5 机会),记录 id 1003 被选择 20 次(1/5机会)。

如何在 MySQL 和/或 PHP 中做到这一点?

提前谢谢了!

4

2 回答 2

2

在 SQL 中执行此操作有点挑战性。如果您的数字真的很小,最简单的方法是执行 across join将记录相乘,然后从那里随机取一行:

select t.*
from t join
     (select 1 as n union all select 2 union all select 3) n
     on n.n <= t.chance
order by rand()
limit 1;

如果“机会”是一个小整数,则此方法有效。

否则,我认为您需要累积机会总​​和,然后进行比较。就像是:

select t.*
from (select t.*, (@sumchance := @sumchance + chance) as sumchance
      from t cross join (select @sumchance := 0) const
     ) t cross join
     (select sum(chance) as totchance from t) tot
where rand()*totchance between sumchance - chance and sumchance
limit 1;

这会计算到给定行的机会总和(顺序没有区别,因为这是随机的)。然后它计算相同范围内的随机数并将其与 和 进行sumchance - chance比较chance。这应该返回一行,但存在rand()*totchance完全等于的边界情况sumchance。可以返回任一行。将其limit 1限制为一排。

于 2013-07-04T19:09:12.147 回答
2

要在 php 中生成随机数,请使用

int rand ( int $min , int $max )

然后使用一系列 if 语句。

例如:

$random = rand (1,100);
(INSERT LOOP)
if ($random <= 20){
$id1001 = $id1001 + 1;
}
else if ($random > 20 and $random < 80){
$id1002 = $id1002 + 1;
}
else if ($random > 80 and $random < 100){
$id1003 = $id1003 + 1;
}
(END LOOP)
于 2013-07-04T18:18:53.520 回答