1

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

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

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,我不希望代码打印出它们的数字,而只是以不同的顺序打印出来,因为理论上它们的数字集已经中奖号码。

我只是无法理解这个逻辑。我会很感激任何帮助。

提前致谢

4

2 回答 2

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

只要对两个数字列表(但不是奖金球)进行排序,您就不会对已绘制的一组数字的不同排序有任何问题。

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

于 2012-08-11T18:45:43.990 回答
1

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

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

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

于 2012-08-11T21:02:54.930 回答