gpt4 book ai didi

php - 根据该行的 "weight"随机选择行

转载 作者:可可西里 更新时间:2023-11-01 08:02:38 24 4
gpt4 key购买 nike

我有一个这样的表:

ID chance
1 1
2 2
3 4
4 1

现在我需要从这个表中选择一个 rand()

SELECT * FROM table
ORDER BY RAND()
LIMIT 1

但是与 ID #1 和 4 相比,ID #2 被选中的机会是它的两倍。同样,与 ID #1 和 4 相比,ID #3 被选中的机会是它的四倍。

有点类似于彩票。

最佳答案

这里是 SQL Fiddle使用仅限 MySQL 的解决方案

select * from (
select id, @running_total as previous_total, @running_total := @running_total + chance AS running_total, until.rand
from (
select round(rand() * init.max) as rand from (
select sum(chance) - 1 as max from demo
) as init
) as until,
demo,
( select @running_total := 0.00 ) as vars
) as results
where results.rand >= results.previous_total and results.rand < results.running_total

算法如下:

  1. 找出所有机会的总和并将其存储在max
  2. 生成一个区间[0, max)的随机数
  3. 对于每一行,计算一个 previous_total(最初为 0) 和一个 current_total 到目前为止遇到的机会
  4. 只保留生成数字在区间[previous_total, current_total)
  5. 中的行

因为我们在区间 [0, sum_of_all_chances) 中选择每个数字的机会是均等的,所以我们可以在这个区间内为每个条目分配与它被选择的机会一样多的数字,确保均匀分布。

@running_total 只是一个 MySQL 变量,我使用 ( select @running_total := 0.00 ) as vars 只是为了给它一个初始值。另外,我使用了 (
从 (
从演示中选择 sum(chance) - 1 作为最大值
) 作为初始化
) as until
只是作为一种总结机会和存储由 MySQL 的 rand 函数生成的随机数的方法。希望这能让代码易于理解。

关于php - 根据该行的 "weight"随机选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48827234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com