Створіть найменші лотерейні квитки, щоб зіграти, щоб мати принаймні N хороших номерів


11

Це досить складний, але дуже цікавий математичний предмет (відомий як "висвітлення проблеми" ),

І я хотів би, щоб ваша допомога була реалізована.

Уявіть лотерейну гру, де кожен квиток повинен вибрати 5 випадкових чисел у наборі з 50 номерів (від 1 до 50).

Досить легко дізнатися ймовірність виграшного квитка або ймовірність мати 1, 2, 3 або 4 хороші числа.

Також досить просто "генерувати" всі квитки, які мають 1, 2, 3, 4 хороших числа.

Моє запитання (і виклик коду) пов'язане з цим, але дещо інакше:

Я хочу придбати кілька лотерейних квитків (найменше можливих), наприклад, принаймні один з моїх квитків має 3 хороші номери.

Виклик

Ваша мета - реалізувати загальне рішення (як програму або просто функцію), як це, будь-якою мовою:

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

Для наведеного вище прикладу потрібно було б просто зателефонувати:

min_lottery_tickets(50, 5, 3)

і програма створить найменший набір квитків, які потрібно грати для досягнення цієї мети.


Приклад:

 min_lottery_tickets(10, 5, 2)

видасть 7 квитків, як-от такі:

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

адже таких квитків достатньо для покриття будь-якої пари номерів від 1 до 10.


Вихідні дані

Текст, один рядок за квитком, таблиці або пробіли між номерами


хто виграє

Виграє найефективніша програма (тобто програма, що генерує найменші квитки за вказаними вище параметрами):

min_lottery_tickets(50, 5, 3)


Дякую!



4
Це питання потребує різних уточнень. Ви після програми, функції чи іншого? Чи має значення вихідний формат? Чи потрібно індексувати числа від 1, або вони можуть бути індексовані від 0? І яка об’єктивна умова виграшу?
Пітер Тейлор

3
@xem це майже належить тоді Math SE. Де вони, ймовірно, докажуть вам, що номери не на вашу користь (хоча існує якийсь номер джекпота, варто придбати квитки)
Cruncher

2
Що таке хороше число?
DavidC

2
Я впевнений, що можна довести, що ви втратите багато грошей, якщо фактично підете купувати квитки за такою програмою.
Майкл Хемптон

Відповіді:


1

Я знаю, що це не оптимально , але ось код у 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);
        }
    }
}

Деякі приклади результатів:

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

інший:

> 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 ]

інший:

> 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 ]

1
Ваш min_lottery_tickets(10, 5, 2)генерує набагато більше рішень, ніж ОП.
Groo

Я знаю @Groo, я сказав, що знаю, що це не оптимально, але це була перша в мене працююча версія;) Будь-які пропозиції щодо того, як видалити "зайві" результати?
мазь

Привіт Гроо, привіт, марле, дякую за цю першу спробу. У вас оцінка 21 (адже ви згенерували 21 квиток за (10,5,2)). Я не знаю, як видалити зайві результати, тому я створив цю тему. Мені все ще цікаво, як виглядає найкращий алгоритм виконання цієї роботи.
xem

Ось кілька хороших читань з цього приводу: (1) dip.sun.ac.za/~vuuren/papers/lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/…
xem

1
Це неповна проблема, тому я боюся, що немає магічного рішення. Ми повинні «грубо» змусити обчислити всі можливі квитки та усунути тих, хто зайвий, порівнявши кожну його групу номерів з усіма іншими квитками. Це зайняло б експоненціальний час.
xem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.