PHP-选择一个随机行,但赔率

PHP-选择一个随机行,但赔率,第1张

概述我有一个行的数据集,每个行的'奇数'值都在1到100之间.我希望以最有效的方式做到这一点.赔率不一定等于100.我有一些想法.一种)选择整个数据集,然后将所有几率相加,并生成一个介于1和该数字之间的随机数.然后遍历数据集,从数字中减去几率,直到它为0.我希望将对数据库的影响降到最低,因此我考虑是否只能选择所需的行.b)SELECT * FROM table

我有一个行的数据集,每个行的’奇数’值都在1到100之间.我希望以最有效的方式做到这一点.赔率不一定等于100.

我有一些想法.

一种)
选择整个数据集,然后将所有几率相加,并生成一个介于1和该数字之间的随机数.然后遍历数据集,从数字中减去几率,直到它为0.

我希望将对数据库的影响降到最低,因此我考虑是否只能选择所需的行.

b)

SELECT * FROM table WHERE (100*RAND()) < odds

我认为liMIT 0,1

但是,如果项目具有相同的概率,则只会返回之一

或者选择整个数据集并从中选择一个随机数据集…但是赔率会受到影响,因为它变成有几率的随机数,然后是没有几率的随机数,因此,几率倾向于较高的几率(甚至更多) .

我想我可以按赔率ASC排序,然后获取整个数据集,然后使用PHP从行中随机抽取一个赔率与第一条记录(最低)相同的行.

似乎是一个笨拙的解决方案.

有谁有出色的解决方案?如果不是以上哪一项最好?

最佳答案做一些前期工作,在表中添加一些有助于选择的列.例如,假设您有这些行

 X  2   Y  3 Z  1

我们添加一些累积值

 Key Odds Start  End  X    2     0     1      // range 0->1,2 values == odds Y    3     2     4      // range 2->4,3 values == odds Z    1     5     5      // range 5->5,1 value == odds

选择开始和结束如下.第一行的起始位置为零.后续行的开头比上一行的结尾多一个.结束是(开始赔率-1).

现在选择一个介于0到Max(End)之间的随机数R

Select * from T where R >= T.Start and R <= T.End

如果数据库足够聪明,我们也许可以使用

 Select * from T where R >= T.Start and R <= (T.Start + T.Odds - 1)

我推测具有索引的End列可能会提供更好的性能.同样,Max(End)可能会藏在某个地方,并在必要时通过触发器进行更新.

显然,更新“开始/结束”有一些麻烦.如果有一个,这可能还不错

>表格内容稳定
>或插入在某种程度上自然地有序,因此每个新行都从旧的最高行继续. 总结

以上是内存溢出为你收集整理的PHP-选择一个随机行,但赔率 全部内容,希望文章能够帮你解决PHP-选择一个随机行,但赔率 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1165805.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存