Znajdowanie różnych kombinacji liczbowych

0

Witam,
Otóż mam za zadanie wylosować 5 liczb z 24 i w tych wylosowanych liczbach znaleźć ile jest kombinacji.
Z czego kombinację to np liczby 1 i 2 lub kombinacja to 6 i 7. Czyli jeśli wylosuje liczby 1, 24, 22, 2, 6. To ma doliczyć do wyniku 1. Potrafię zrobić to dla jednej liczny np, żeby znajdowało tylko 1 lub tylko 2, ale nie potrafię, żeby zrobiło to jednocześnie dla danej kombinacji. A ponadto nie wiem jak zrobić, żeby wśród wylosowanych liczb nie występowały te same np (1,5,1,3,22).
Wrzucam kod który umożliwia zliczanie występowania jednej liczny:

{
    class Program
    {
        static void Main(string[] args)
        { 
            int licznik = 0;

            Console.WriteLine(losuj(licznik));
            Console.ReadLine();
        }
        static int losuj (int licznik)
        {
            int a = 5;

            Random zmienna = new Random();
            int[] tab = new int[5];

                for (int i = 0; i < 5; i++)
                {
                    tab[i] = zmienna.Next(1, 6);
                    if (tab[i] == a)
                    {
                        licznik++;
                    }
                    Console.Write(tab[i] + " ");
                }
                Console.WriteLine();
            
            return licznik;
        }
    }
}
0

Napisz to jeszcze raz po polsku, proszę. Na razie rozumiem tyle, że program ma wylosować (bez powtórzeń) pięć liczb z 24.Czyli, mamy pięć liczb i jakie i z czego kombinacje są do policzenia?

0
lion137 napisał(a):

Napisz to jeszcze raz po polsku, proszę. Na razie rozumiem tyle, że program ma wylosować (bez powtórzeń) pięć liczb z 24.Czyli, mamy pięć liczb i jakie i z czego kombinacje są do policzenia?

Wybacz za zagmatwanie, tak jak już napisałeś program losuje pięć liczb z zakresu od 1 do 24, te liczby nie mogą się powtarzać. Moim zamysłem jest napisanie programu w którym mam np:
int a =1;
int b = 2;
Jeśli program wylosuje np 1,5,22,2,6 to widać, że mam tam moje szukane liczby czyli 1 i 2. Jeśli tak będzie to program ma doliczyć jeden a jeśli nie znajdzie jednocześnie 1 i 2 np (1,6,8,22,4) to wtedy nic się nie stanie. Kod który wysłałem umożliwia sprawdzenie czy w wylosowanych liczbach znajduje się mój int a, natomiast nie potrafię sprawdzić czy jednocześnie znajduje się również int b.

0

Użyj HashSet i do losowania bez powtórzeń (Losujesz w pętli dodając do zbioru, aż do długości pięć); i do sprawdzania czy dane liczby są w zbiorze, pseudokod:

check_set = {1, 2}
num_set = {2, 24, 1, 5, 7 }
if check_set.intersection(num_set) == check_set:
    counter += 1
0

Pomógłbym ale nie rozumiem o jakie kombinacje chodzi . Są kombinacje bez powtórzeń , z powtórzeniami
Sprawiasz wrażenie osoby która nie umie matematyki, polskiego i programwania zarazem
Załóżmy że mamy 24 punumerowane kule od 1 do 24. Losujemy 5 kul np. 4, 10, 12, 17, 19.
Teraz pytanie co dalej chcesz zrobić .

0

Algorytmów losowania liczb można wymyślić bardzo wiele . Mam już nawet jeden pomysł jak to zrobić żeby komputer nie losował 10 razy już wylosowanej liczby .
Może ten kod nie będzie wyglądał efektownie ale będzie spełniał swoje zadanie .

0

Tak na szybko . Jesli ktoś chce poprawić , żeby było lepiej to proszę

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] wylosowaneLiczby = LosujLiczby(5, 5);
            for (int i = 0; i < wylosowaneLiczby.Length; i++)
            {
                Console.WriteLine(wylosowaneLiczby[i]);
            }
        }




        static int[] LosujLiczby(int wielkoscZbioru, int ileLiczb)
        {

            if (wielkoscZbioru < ileLiczb) throw new Exception("Za maly zbiór liczb!");
            int[] losowaneLiczby = new int[wielkoscZbioru];
            int[] wylosowaneLiczby = new int[ileLiczb];
            Random rn = new Random(DateTime.Now.Millisecond);
            int wylosowanaLiczba;
        
            for (int i = 0; i < wielkoscZbioru; i++)
            {
                losowaneLiczby[i] = i + 1;
            }
            for (int i = 0; i < ileLiczb; i++)
            {  
                wylosowanaLiczba = rn.Next(0, wielkoscZbioru - 1);               
                wylosowaneLiczby[i] = losowaneLiczby[wylosowanaLiczba];
                losowaneLiczby[wylosowanaLiczba] = -1;
                for (int j = 0, k = 0; j < wielkoscZbioru; j++)
                {
                    if (losowaneLiczby[j] != -1)
                    {
                        losowaneLiczby[k] = losowaneLiczby[j];
                        k++;
                    }
                }
                wielkoscZbioru--;
            }
            return wylosowaneLiczby;
        }
    }
}
0

Ja bym skrócił tą metodę

static int[] LosujLiczby(int wielkoscZbioru, int ileLiczb)
        {
            if (wielkoscZbioru < ileLiczb) throw new Exception("Za maly zbiór liczb!");
            Random rand = new Random(DateTime.Now.Millisecond);
            List<int> possible = Enumerable.Range(1, wielkoscZbioru).ToList();
            List<int> listNumbers = new List<int>();
            for (int i = 0; i < ileLiczb; i++)
            {
                int index = rand.Next(0, possible.Count);
                listNumbers.Add(possible[index]);
                possible.RemoveAt(index);
            }
            return listNumbers.ToArray();
        }
0

A pomieszanie tablicy od 1 do 24 i pobranie pierwszych pięciu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1