我正在编写一个生成宾果卡号码的程序。宾果卡由5列组成,每列4个数字。对于第一列,只能包含数字1-8,第二列9-16等等(最多40个)。
所以在数据库中,我做的是我有两个表。第一个表用于列号。每列包含一组唯一的数字(每列70个,这是8个组合4)。对于5列,我将有350套。第二个表是卡号。它由5列组成,每列对应于B,I,N,G,O的行。总共有1,680,700,000。该表的可能组合。我这样做是因为每张游戏的每张牌都是重复的,只有牌的控制号才是唯一的。
我想跟踪每个抽出号码的获胜卡片。我需要尽可能快地跟踪,因为在这里谈论数以百万计的卡片。我想到了两个选项:
首先,检查卡上是否存在每个抽出的号码,最小化每次抽奖的卡片池。
其次,为每个数字(1-40)关联一个唯一的素数,将它们相乘并将产品与列相关联(我将其称为主要指数)。每列的5个主要索引相乘,产品与每个卡/组合(我称之为卡索引)相关联。绘制数字时,将相关的素数从卡片索引中划分,检查所绘制的数字是否是卡片索引的因子。每次连续抽奖都会减少卡片索引(对于池中的每张卡片),如果存在获胜卡片,则减少到1。我将使用MySQL和Java。这两种技术中哪一种更快?我也考虑了内存空间,负载等,但对我来说跟踪的速度更重要。非常感谢!
P.S。很抱歉很长的解释。我只想澄清一些事情。 :d
答案 0 :(得分:2)
如果你想要真正快速,只需要在需要时将你的2400万张卡留在内存中,然后进行简单的比较。使用数据库是过度的,只会让一切变得更加困难。 RAM不再贵了。
答案 1 :(得分:1)
正好有70 ^ 5 = 1,680,700,000张可能的牌。无需存储卡本身。您可以直接计算卡上的数字,仅使用索引。相反,给定数字找到卡片的指数,只是有点难度。
例如,卡#1421934546。将其放在基数70中给出:59 15 40 50 46
。 (我的意思是46 + 70*50 + 70^2*40 + 70^3*15 + 70^4*59 = 1421934546
)。因此,第一列是第46列(实际上是第47列因为一个一个)取得了可能的70次拍摄。
根据绘制的数字,您可以快速找到匹配的列。例如,使用数字1,2和3.第一列中有5组匹配,1234
,1235
,1236
,1237
和{{1} }。因此,所有匹配的卡在这5个ID中都有%70。如果您找到每列的所有可能集合,则笛卡尔积将提供所有匹配的卡片。
答案 2 :(得分:0)
您不必像在卡上那样将数据排列在内存中。例如如果你有N个方块可以选择或不选择,BitSet可能是一个不错的选择。这使用每平方1位(带有一些开销)。
假设您有多达64个方格,这是一个长值(64位)。如果你有100万张牌。这将占用8 MB的内存。一旦您确定哪些卡是获胜者,您就可以确定所有者是谁。 (这可以存储在数据库中)
假设您向美国的每个成年人出售一张卡片。 (AFAIK,没有彩票从未如此流行)每说一美元,你将带来2亿美元。您需要1.6 GB的内存,这将适合4 GB的服务器,成本约为500美元。你可以买一台16 GB的服务器,价格大约1000美元。 ;)