我正在尝试对乐透结果进行一些基本分析:)
我有一个类似于:
的数据库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已经出现,我不希望代码打印出它们的数字,只是按照不同的顺序,因为理论上它们的数字已经是中奖号码。
我无法理解这个逻辑。我很感激任何帮助。
提前致谢
答案 0 :(得分: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
只要两个数字列表(但不是奖励球)都已排序,您就不会对已经绘制的数字组的不同排序产生任何问题。
由于您之前的抽奖数据库变得更加充实,这将变得不那么有效,但我认为您不必担心这几十年。 : - )
答案 1 :(得分:1)
如何按某种顺序对每个已绘制的结果(每一行)进行排序,然后升序,然后对已经绘制的结果(所有行)进行排序?然后,您将有一个易于查找的列表,您可以在其中查看剩余的内容。
比如说你想要一个从未画过的套装吗?你只需要循环遍历列表,直到你发现一个“洞”,这将是一个前所未有的集合。如果你想进一步优化,你可以存储你最后找到一个“洞”的索引。然后你永远不需要在列表的同一部分循环两次,你甚至可以放弃列表中的“已完成”部分以节省磁盘空间,或者如果你想要新的数字,你可以随机缝制你可以从列表中的随机偏移量开始。
为了有效地执行此操作,您应该创建一个额外的列来存储预先排序的集合。例如,如果您有(5,3,6,4,1,2)该列可以包含010203040506。添加足够的零以便数字以固定偏移量出现。