我想在未来的彩票系统中生成一系列数字。每个系列由6个数字组成。这些数字是从50个不同数字的池中选出的。最初从池中删除6个号码,这6个号码成为累积奖金系列。数字顺序无关紧要
现在门票系列。一个系列有六个数字,如果它有3个或更多的数字,它与中奖号码中的数字匹配,它是一个获胜系列。因此,如果累积奖金为1,2,3,4,5,6,例如,1,2,3,7,8,9或1,2,3,4,0,19系列可被视为赢家。
现在我的问题。我想生成所有获胜的门票系列(每个门票中都有六个数字,其中有3个或更多匹配的数字)。由于顺序无关紧要,我认为数学答案是[(6选3)*(44选3)] [[(6选4)*(44选2)] + [(6选5)*( 44选择1)] + 1.如果我错了,请纠正我。但是,我也想知道如何在Java或某些伪代码中实现它。
提前感谢所有的帮助。
答案 0 :(得分:1)
以下是一些Haskell,由于您对Java感兴趣,因此可能属于伪代码。
-- Return a list of tickets drawn from the numbers in nums
-- having length n and at least k numbers in common with jackpot.
winners :: Int -> Int -> [Int] -> [Int] -> [[Int]]
winners n k jackpot nums = go n k (length jackpot) nums
where
-- needed = count of numbers needed to fill a ticket
-- jneeded = count of jackpot numbers needed for a winner
-- jleft = count of jackpot numbers left in the list nums
-- nums = remaining numbers to pick from
go :: Int -> Int -> Int -> [Int] -> [[Int]]
go needed jneeded jleft nums
| needed <= 0 = if jneeded <= 0 then [ [] ] else []
| jneeded > jleft = []
go needed jneeded jleft [] = []
go needed jneeded jleft (d:ds) = useD ++ dontUseD
where
jneeded' = if elem d jackpot then jneeded-1 else jneeded
jleft' = if elem d jackpot then jleft-1 else jleft
useD = map (d:) $ go (needed-1) jneeded' jleft' ds
dontUseD = go needed jneeded jleft' ds
example = print $ winners 4 2 [2,5,8] [1..9]