Gere o menor número de bilhetes de loteria para jogar, a fim de ter pelo menos N bons números

11

Esse é um assunto de matemática bastante complexo, mas muito interessante (conhecido como "problema de cobertura" ),

E eu gostaria da sua ajuda para implementá-lo.

Imagine um jogo de loteria, em que cada bilhete deve escolher 5 números aleatórios em um conjunto de 50 números (de 1 a 50).

É muito fácil saber a probabilidade de um bilhete premiado ou a probabilidade de ter 1, 2, 3 ou 4 números bons.

Também é muito fácil "gerar" todos os tickets com 1, 2, 3, 4 números bons.

Minha pergunta (e desafio de código) está relacionada a isso, mas um pouco diferente:

Quero comprar alguns bilhetes de loteria (o menor número possível), como pelo menos um dos meus bilhetes tem 3 números bons.

Desafio

Seu objetivo é implementar uma solução genérica (como um programa ou apenas uma função), como esta, em qualquer idioma:

// Input: 3 prameters
min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want)

Para o exemplo acima, basta chamar:

min_lottery_tickets(50, 5, 3)

e o programa gerará o menor conjunto de ingressos para jogar para atingir esse objetivo.


Exemplo:

 min_lottery_tickets(10, 5, 2)

produziria 7 tickets, como os seguintes:

1   2   3   4   5
5   6   7   8   9
10  1   2   6   7
10  3   4   8   9
3   4   6   7   8
1   2   3   8   9
1   4   9   5   10

porque esses ingressos são suficientes para cobrir qualquer par de números de 1 a 10.


Resultado

Texto, uma linha por ticket, tabulações ou espaços entre números


quem ganha

O programa mais eficiente vence (ou seja, o programa que gera o menor número de tickets para os parâmetros acima):

min_lottery_tickets(50, 5, 3)


Obrigado!

xem
fonte
Relacionado .
Peter Taylor
4
Esta questão precisa de vários esclarecimentos. Você está procurando um programa, uma função ou qualquer um? O formato da saída é importante? Os números precisam ser indexados a partir de 1 ou podem ser indexados a partir de 0? E qual é a condição objetiva de ganhar?
Peter Taylor
3
@ xem isso quase pertence ao Math SE então. Onde provavelmente vai provar-lhe que os números não estão a seu favor (embora não existe algum número jackpot st TI de bilhetes vale a pena comprar)
Cruncher
2
O que é um bom número?
DavidC
2
Tenho certeza de que é provável que você perca muito dinheiro se realmente comprar os ingressos produzidos por esse programa.
Michael Hampton

Respostas:

1

Eu sei que não é o ideal , mas aqui está o código no node.js:

function min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want) {
    c(function(result) {
        var other = result[result.length - 1];
        while (result.length < how_many_numbers_to_choose) {
            other++;
            var already = false;
            for (var i = 0; i < result.length; i++) {
                if (other === result[i]) {
                    already = true;
                    break;
                }
            }
            if (!already) {
                result.push(other);            
            }
        }
        if (other <= total_numbers_to_choose_from) {
            // Print results
            console.log(result);
        }
    }, total_numbers_to_choose_from, how_many_good_numbers_i_want);
}

function c(next, total_numbers, length, start, results) {
    if (!start) start = 1;
    if (!results) results = [];

    for (var i = start; i <= total_numbers + 1 - length; i++) {
        var resultsNew = results.slice(0);
        resultsNew.push(i);
        if (length > 1) {
            c(next, total_numbers, length - 1, i + 1, resultsNew);
        } else {
            next(resultsNew);
        }
    }
}

Alguns exemplos de resultados:

> min_lottery_tickets(5, 3, 2)
[ 1, 2, 3 ]
[ 1, 3, 4 ]
[ 1, 4, 5 ]
[ 2, 3, 4 ]
[ 2, 4, 5 ]
[ 3, 4, 5 ]

de outros:

> min_lottery_tickets(10, 5, 2)
[ 1, 2, 3, 4, 5 ]
[ 1, 3, 4, 5, 6 ]
[ 1, 4, 5, 6, 7 ]
[ 1, 5, 6, 7, 8 ]
[ 1, 6, 7, 8, 9 ]
[ 1, 7, 8, 9, 10 ]
[ 2, 3, 4, 5, 6 ]
[ 2, 4, 5, 6, 7 ]
[ 2, 5, 6, 7, 8 ]
[ 2, 6, 7, 8, 9 ]
[ 2, 7, 8, 9, 10 ]
[ 3, 4, 5, 6, 7 ]
[ 3, 5, 6, 7, 8 ]
[ 3, 6, 7, 8, 9 ]
[ 3, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8 ]
[ 4, 6, 7, 8, 9 ]
[ 4, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9 ]
[ 5, 7, 8, 9, 10 ]
[ 6, 7, 8, 9, 10 ]

de outros:

> min_lottery_tickets(10, 5, 3)
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 4, 5, 6 ]
[ 1, 2, 5, 6, 7 ]
[ 1, 2, 6, 7, 8 ]
[ 1, 2, 7, 8, 9 ]
[ 1, 2, 8, 9, 10 ]
[ 1, 3, 4, 5, 6 ]
[ 1, 3, 5, 6, 7 ]
[ 1, 3, 6, 7, 8 ]
[ 1, 3, 7, 8, 9 ]
[ 1, 3, 8, 9, 10 ]
[ 1, 4, 5, 6, 7 ]
[ 1, 4, 6, 7, 8 ]
[ 1, 4, 7, 8, 9 ]
[ 1, 4, 8, 9, 10 ]
[ 1, 5, 6, 7, 8 ]
[ 1, 5, 7, 8, 9 ]
[ 1, 5, 8, 9, 10 ]
[ 1, 6, 7, 8, 9 ]
[ 1, 6, 8, 9, 10 ]
[ 1, 7, 8, 9, 10 ]
[ 2, 3, 4, 5, 6 ]
[ 2, 3, 5, 6, 7 ]
[ 2, 3, 6, 7, 8 ]
[ 2, 3, 7, 8, 9 ]
[ 2, 3, 8, 9, 10 ]
[ 2, 4, 5, 6, 7 ]
[ 2, 4, 6, 7, 8 ]
[ 2, 4, 7, 8, 9 ]
[ 2, 4, 8, 9, 10 ]
[ 2, 5, 6, 7, 8 ]
[ 2, 5, 7, 8, 9 ]
[ 2, 5, 8, 9, 10 ]
[ 2, 6, 7, 8, 9 ]
[ 2, 6, 8, 9, 10 ]
[ 2, 7, 8, 9, 10 ]
[ 3, 4, 5, 6, 7 ]
[ 3, 4, 6, 7, 8 ]
[ 3, 4, 7, 8, 9 ]
[ 3, 4, 8, 9, 10 ]
[ 3, 5, 6, 7, 8 ]
[ 3, 5, 7, 8, 9 ]
[ 3, 5, 8, 9, 10 ]
[ 3, 6, 7, 8, 9 ]
[ 3, 6, 8, 9, 10 ]
[ 3, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8 ]
[ 4, 5, 7, 8, 9 ]
[ 4, 5, 8, 9, 10 ]
[ 4, 6, 7, 8, 9 ]
[ 4, 6, 8, 9, 10 ]
[ 4, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9 ]
[ 5, 6, 8, 9, 10 ]
[ 5, 7, 8, 9, 10 ]
[ 6, 7, 8, 9, 10 ]
gaze
fonte
1
Seu min_lottery_tickets(10, 5, 2)gera muito mais soluções do que OP.
Groo
Eu sei @Groo, eu disse que sabia que não era o ideal, mas esta foi a primeira versão de trabalho que tive;) Alguma sugestão sobre como remover resultados "redundantes"?
Greuze
Oi Groo, Oi greuze, muito obrigado por esta primeira tentativa. Você tem uma pontuação de 21 (porque você gerou 21 tickets para (10,5,2)). No entanto, não sei como remover os resultados redundantes, por isso criei este tópico. Ainda estou imaginando como será o melhor algoritmo para fazer esse trabalho.
xem
Aqui estão algumas boas leituras sobre o assunto: (1) dip.sun.ac.za/~vuuren/papers/lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/…
xem
1
É um problema completo de NP, então, receio que não haja solução mágica. Temos que "força bruta" o cálculo de todos os tickets possíveis e a eliminação daqueles que são redundantes, comparando cada um de seu grupo de números com todos os outros tickets. Isso levaria um tempo exponencial.
xem 16/01