【问题标题】:Lottery number analysis彩票号码分析
【发布时间】:2012-08-11 18:30:19
【问题描述】:

我正在尝试对乐透结果进行一些基本分析:)

我有一个看起来像这样的数据库:

id|no|day|dd|mmm|yyyy|n1|n2|n3|n4|n5|n6|bb|jackpot|wins|machine|set
--------------------------------------------------------------------
1 |22|mon|22|aug|1999|01|05|11|29|38|39|04|2003202| 1  | Topaz | 3
2 |23|tue|24|aug|1999|01|06|16|21|25|39|03|2003202| 2  | Pearl | 1

这只是一个例子。所以,n1 到 n6 是彩票中的标准球,bb 代表红利球。

我想编写一个 PHP/SQL 代码,它只显示一个尚未出现的随机数字序列。但是,如果出现了数字 01、04、05、11、29、38 和 39,我不希望代码打印出它们的数字,而只是以不同的顺序打印出来,因为理论上它们的数字集已经中奖号码。

我只是无法理解这个逻辑。如有任何帮助,我将不胜感激。

提前致谢

【问题讨论】:

  • “我想编写一个 PHP/SQL 代码来显示一系列尚未出现的数字。”...我不确定这是什么意思。您确实意识到在典型的乐透抽奖中有数百万种排列方式。您想输出数据库中没有的所有排列吗?
  • 不,它只会生成一个随机序列,抱歉没有说明
  • 所以您想生成一组七个数字并检查数据集中是否存在所述序列?第一个建议:确保您按升序存储值。这将大大简化您的问题。
  • 获取您的号码集的所有排列(例如:010512034523011203230545 等),首先进行查询以查看该列表中是否有条目(我有一个组合的数字字段),如果没有,则获取一个新列表,如果是,则迭代直到找到第一个没有匹配项。

标签: php mysql


【解决方案1】:

假设球按升序存储在您的数据库中,就像您给出的示例一样,您可以生成一个由 6 个数字组成的随机序列,对它们进行排序,然后生成 1 个随机奖金数字。完成后,只需对数据库执行一个简单的 SQL 查询并查看它是否返回结果即可:

$nums=...//generate your 6 numbers plus bonus number here
sort($nums);

$mysqli=new mysqli('...','...','...','...');
$stmt=$mysqli->prepare("SELECT * FROM table
    WHERE n1=? AND n2=? AND n3=? AND n4=? AND n5=? AND n6=? AND bb=?");
$stmt->bind_param('iiiiiii', $nums[0], $nums[1], $nums[2], $nums[3], $nums[4], $nums[5], $nums[6]);
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows==0)
    //your numbers have not been drawn before - return them
else
    //otherwise loop round and try again

只要对两个数字列表(但不是红利球)都进行了排序,您就不会对已抽出的数字集的不同排序有任何问题。

随着您以前抽奖的数据库变得越来越完整,这将变得不那么有效,但我认为您不必担心几十年。 :-)

【讨论】:

  • 球可以按任何顺序排列。 123 应该被认为与 312 相同。
  • @HappyTimeGopher 因此随机生成的球的排序。
  • 你是对的 - 我错过了。作为性能改进(@JaredFarrish 建议),可以创建一个附加列,所有数字一起运行。然后在上面放一个索引,即使在几十年后它也会飞起来。
  • @HappyTimeGopher 我喜欢索引的想法 - 但我所说的低效率是生成一个以前从未见过的序列。现在这很容易 - 有 18000 次抽签(粗略估计),所以仍有大量 1370 万种不同的组合未抽签。快进几十年(几个世纪?),未绘制的组合的数量会少得多,因此随机生成其中一个将变得更加困难。
  • 我不太明白这是什么;这是否是搜索算法的一部分,在循环中拒绝和重新计算,直到找不到结果?其次,n1=? 问号是否意味着一个占位符,一个 la PDO?
【解决方案2】:

如何按某种顺序对每个已绘制的结果(每一行)进行排序,可能升序,然后对已绘制的结果集(所有行)进行排序?然后您将有一个易于查找的列表,您可以在其中看到要绘制的内容。

比如说你想要一个从未绘制过的集合?您只需要遍历列表,直到发现一个“洞”,这将是一个前所未有的集合。如果您想进一步优化,您也可以将上次发现“漏洞”的索引存储在哪个索引处。然后,您将永远不需要遍历列表的同一部分两次,您甚至可以放弃列表的“已完成”部分以节省磁盘空间,或者如果您希望您想出的新数字随机缝合,您可以从列表中的随机偏移量开始。

要有效地做到这一点,您应该创建一个额外的列来存储预先排序的集合。例如,如果您有 (5, 3, 6, 4, 1, 2),则该列可能包含 010203040506。添加足够多的零,以便数字以固定偏移量出现。

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多