Tạo ít vé số nhất để chơi để có ít nhất N số tốt


11

Đây là một môn toán khá phức tạp nhưng rất thú vị (được gọi là "vấn đề bao trùm" ),

Và tôi muốn sự giúp đỡ của bạn để thực hiện nó.

Hãy tưởng tượng một trò chơi xổ số, trong đó mỗi vé phải chọn 5 số ngẫu nhiên trong một bộ gồm 50 số (từ 1 đến 50).

Thật dễ dàng để biết xác suất của một vé chiến thắng, hoặc xác suất để có 1, 2, 3 hoặc 4 số tốt.

Cũng khá dễ dàng để "tạo" tất cả các vé có 1, 2, 3, 4 số tốt.

Câu hỏi của tôi (và thử thách mã) có liên quan đến điều này, nhưng hơi khác:

Tôi muốn mua một số vé số (ít nhất có thể), chẳng hạn như ít nhất một trong số các vé của tôi có 3 số tốt.

Thử thách

Mục tiêu của bạn là triển khai một giải pháp chung (như một chương trình hoặc chỉ là một chức năng), như thế này, bằng bất kỳ ngôn ngữ nào:

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

Đối với ví dụ trên, người ta chỉ cần gọi:

min_lottery_tickets(50, 5, 3)

và chương trình sẽ tạo ra một bộ vé nhỏ nhất để chơi để đạt được mục tiêu này.


Thí dụ:

 min_lottery_tickets(10, 5, 2)

sẽ xuất 7 vé, giống như:

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

bởi vì vé như vậy là đủ để bao gồm bất kỳ cặp số từ 1 đến 10.


Đầu ra

Văn bản, một dòng trên mỗi vé, bảng hoặc khoảng trắng giữa các số


ai thắng

Chương trình hiệu quả nhất sẽ thắng (tức là chương trình tạo ra ít vé nhất cho các tham số trên):

min_lottery_tickets(50, 5, 3)


Cảm ơn!



4
Câu hỏi này cần làm rõ khác nhau. Bạn có sau một chương trình, một chức năng, hoặc một trong hai? Liệu định dạng đầu ra có vấn đề? Các số phải được lập chỉ mục từ 1, hoặc chúng có thể được lập chỉ mục từ 0? Và điều kiện chiến thắng khách quan là gì?
Peter Taylor

3
@xem cái này gần như thuộc về Math SE rồi. Nơi họ có thể sẽ chứng minh cho bạn thấy rằng những con số không có lợi cho bạn (mặc dù vẫn tồn tại một số số jackpot đáng để mua vé)
Cruncher

2
Một số tốt là gì?
DavidC

2
Tôi khá chắc chắn rằng có thể chứng minh rằng bạn sẽ mất rất nhiều tiền nếu bạn thực sự đi mua vé đầu ra bằng một chương trình như vậy.
Michael Hampton

Câu trả lời:


1

Tôi biết nó không tối ưu , nhưng đây là mã trong 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);
        }
    }
}

Một số ví dụ kết quả:

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

khác:

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

khác:

> 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
Bạn min_lottery_tickets(10, 5, 2)tạo ra nhiều giải pháp hơn OP.
Groo

Tôi biết @Groo, tôi đã nói rằng tôi biết nó không tối ưu, nhưng đây là phiên bản làm việc đầu tiên tôi có;) Bạn có đề xuất nào về cách loại bỏ kết quả "dư thừa" không?
chào mừng

Xin chào Groo, Hi greuze, cảm ơn rất nhiều vì lần thử đầu tiên này. Bạn có số điểm là 21 (vì bạn đã tạo được 21 vé cho (10,5,2)). Tôi không biết làm thế nào để loại bỏ các kết quả dư thừa, tuy nhiên, đó là lý do tại sao tôi tạo chủ đề này. Tôi vẫn đang tự hỏi thuật toán tốt nhất để làm công việc này trông như thế nào.
xem

Dưới đây là một số bài đọc hay về chủ đề này: (1) dip.sun.ac.za/~vuuren/ con / lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/
xem

1
Đó là một vấn đề hoàn chỉnh NP, vì vậy tôi sợ không có giải pháp kỳ diệu. Chúng tôi phải "vũ phu" tính toán tất cả các vé có thể và loại bỏ những người dư thừa bằng cách so sánh từng nhóm số của nó với tất cả các vé khác. Điều đó sẽ mất một thời gian theo cấp số nhân.
xem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.