Wątek przeniesiony 2020-05-27 11:42 z C/C++ przez kq.

Generowanie liczb rosnąco i malejąco w C#

0

Cześć,

Dopiero zaczynam swoją przygodę z c# i przy niektórych zadaniach mam pewne problemy.
Muszę wygenerować przy pomocy funkcji Random ciąg liczb rosnący i malejący a następnie posortować je wybraną przez siebie metodą.
Zastanawiam się tylko po co generować ciąg liczb np rosnący skoro taki ciąg otrzymam po sortowaniu? Próbuję to ogarnąć i nie bardzo potrafię.
Jeśli ktoś mógłby przestawić mnie na dobry tok rozumowania to będę wdzięczny.

Pozdrawiam

1

Napisz 2 funkcje, jedna generująca x liczb metodą Random z założeniem, że każdy kolejny Random ma być większy od poprzedniego i druga funkcja robiąca to samo z założeniem, że każdy kolejny Random ma być mniejszy od poprzedniego. Masz randomowe liczby w zależności od funkcji malejące lub rosnące w postaci szeregu.

0
Krzysztof Pe napisał(a):

Napisz 2 funkcje, jedna generująca x liczb metodą Random z założeniem, że każdy kolejny Random ma być większy od poprzedniego i druga funkcja robiąca to samo z założeniem, że każdy kolejny Random ma być mniejszy od poprzedniego. Masz randomowe liczby w zależności od funkcji malejące lub rosnące w postaci szeregu.

Dzięki za odpowiedź. Czy to ma wyglądać coś w tym stylu?:

static void Generator(int[] tablica)
{
Random Generator = new Random();
for (int i = 0; i < tablica.Length + 1; i++)
{
tablica[i] - Generator.Next();
}
}
1
lap94 napisał(a):

Dzięki za odpowiedź. Czy to ma wyglądać coś w tym stylu?:

tablica[i] - Generator.Next();

Losujesz liczbę, a nawet wykonujesz odejmowanie, ale nic się nie dzieje z wynikiem.
W C# to się nawet nie skompiluje.

0

A czy mógłbyś napisać nam pełne polecenie? Bo to brzmi na absurd i mam podejrzenie ,że trzeba wylosować pewien ciąg liczb ,a następnie je posortować malejąco i rosnąco

0
Botek napisał(a):

A czy mógłbyś napisać nam pełne polecenie? Bo to brzmi na absurd i mam podejrzenie ,że trzeba wylosować pewien ciąg liczb ,a następnie je posortować malejąco i rosnąco

Polecenie brzmi:

Porównaj szybkość działania 4 metod sortowania: Insertion Sort, Selection Sort, Heap Sort, Cocktail Sort dla tablicy
liczb całkowitych (rzędu 50k ‐ 200k elementów) generowanych w postaci: losowej, rosnącej, malejącej, stałej, v‐
kształtnej.

0

No i teraz zaczyna mieć to sens bo liczby nie muszą być tylko rosnące lub malejące , tylko mogą być np. losowe. Zastosuj to o czym pisał @Azarien + popraw warunek pętli. Warunek ten ma być do tablica.Lenght a nie do tablica.Lenght+1 I wtedy masz zrobiony generowanie liczb losowych

1

Tam są przecinki, mają być ciągi losowy oraz rosnący, a nie losowy i rosnący jednocześnie.

1

Moim zdaniem najsensowniejsze w tym zadaniu będzie wylosować ciąg po czym go posortować rosnąco, malejąco. i potem sortować jeszcze raz i sprawdzać czasy w których się to sortowanie wykonuje. W zadaniu chodzi o to by sprawdzić np. Jak szybko algorytm złapie ,że już ma posortowany ciąg. itd. Można niby wygenerować od razu rosnący ciąg ,ale zawsze to się wiąże z pewnymi ograniczeniami i tym ,że te liczby nie będą do końca losowo porozrzucane w danym przedziale (chyba ,że ja nie umiem sobie wyobrazić takiej metody). Dlatego bym to zrobił tak

  1. Losowe liczby - po prostu losujesz
  2. Rosnące - losujesz liczby i sortujesz rosnąco
  3. Malejące- losujesz i sortujesz malejąco
  4. Stały no to tutaj losujesz liczbę i wypełniasz nią tablicę
  5. v-kształtny - Tutaj bym wylosował tablicę znalazł max umieścił na środku i posortował odpowiednio strony.

Gdy masz już te pięć zbiorów to robisz dla nich sortowania ,które masz w poleceniu i mierzysz ich czas. Spróbuj to napisać a my poprawimy.

1

Dziękuję za wszystkie odpowiedzi i wskazówki.

Wykonałem, tak jak radził @Botek, prawie pięć zbiorów.

  1. Losowe liczby:
        static void GeneratorLosowo(int[] tablica)
        {
            Generator(tablica);
            for (int i = 0; i < tablica.Length; i++)
            {
                Console.Write(tablica[i] + ", ");
            }
            Console.WriteLine();
        }
  1. Rosnące:
        static void GeneratorRosnaco(int[] tablica)
        {
            Generator(tablica);
            for (int i = 0; i < tablica.Length; i++)
            {
                Array.Sort(tablica);
                Console.Write(tablica[i] + ", ");
            }
            Console.WriteLine();
        }
  1. Malejące:
        static void GeneratorMalejaco(int[] tablica)
        {
            Generator(tablica);
            for (int i = 0; i < tablica.Length; i++)
            {
                Array.Sort(tablica);
                Array.Reverse(tablica);
                Console.Write(tablica[i] + ", ");
            }
            Console.WriteLine();
        }
  1. Stałe - tutaj nie bardzo wiem jak to ma wyglądać. Mam wygenerować tylko jedną liczbę która wypełni wszystkie elementy zdefiniowanej przeze mnie tablicy?

  2. V-Kształtny:

        static void GeneratorV(int [] tablica)
        {
            Generator(tablica);
            for (int i = 0; i < tablica.Length; i++)
            { 
                Console.Write(tablica[i] + ", "); 
            }
            int max;
            max = tablica[0];
            for (int i = 0; i < tablica.Length; i++)
            {
                if (tablica[i] > max)
                {
                    max = tablica[i];
                }
            }
            Console.Write("Maximum element = {0}\n", max);
            Console.WriteLine();
        }

Tutaj z kolei wygenerowałem tablice z liczbami. Znalazłem max, ale nie mam totalnie pojęcia jak umieścić go w środku tablicy.

Proszę o wskazówki.

0

Ad.4

 Random random = new Random();
 int randomvalue = random.Next();
 int[] tab = Enumerable.Repeat(randomvalue, 200000).ToArray();

Coś takiego możesz zrobić.

Ad. 2,3

static int[] GeneratorMalejaco()
    {
        int[] tablica= Generator();
        Array.Sort(tablica);
        Array.Reverse(tablica);
        return tablica;

    }

Tablica ci potem będzie potrzebna do sortowania więc dobrze jakby funkcja ją zwracała. Posortować wystarczy ją raz. Ogólnie to nie rozumiem tego czemu masz w argumentach tablica skoro generujesz ją w funkcji. Pokaż jak u ciebie wygląda generator.

A i na marginesie staraj się pisać po angielsku to dobry nawyk na przyszłość.

0

Generator wygląda tak:

        static void Generator (int[] tablica)
        {
            Random Generator = new Random();
            for (int i = 0; i < tablica.Length; i++)
            {
                tablica[i] = Generator.Next(1, 200);
            }
        }

a w klasie Main zdefiniowałem tablicę. To może wyglądać bardzo chaotycznie dla kogoś kto ogarnia, ale jak na wstępie wspomniałem, dopiero zaczynam c#.

0

Ja bym osobiście nie ograniczał funkcji random w tym zadaniu. Nazwa generator kojarzy się z generowaniem tablicy więc ja bym ją napisał tak

        static int[] Generator(int size)
        {
            int[] tablica = new int[size];
            Random Generator = new Random();
            for (int i = 0; i < tablica.Length; ++i)
            {
                tablica[i] = Generator.Next();
            }
            return tablica;
        }

I co do V-kształtnej wprowadziłem cię w błąd powinieneś szukać minimum.

Ad. 5

         static int[] GenerateVArray(int size)
        {
            int[] tab = Generator(size);
            Array.Sort(tab, 0, tab.Length / 2 + 1);
            Array.Reverse(tab, 0, tab.Length / 2 + 1);
            Array.Sort(tab, tab.Length/2, tab.Length / 2+ tab.Length % 2);
            return tab;
        }

Ale musisz sprawdzić czy się wszystko zgadza bo pisałem na szybko.

1

W tym zadaniu random masz zastosować tylko do ciągu losowego, ciąg rosnący może być po prostu 1,2,3,4, malejący 4,3,2,1 a v-kształtny 1,2,3,2,1. nie musisz używać random do ich generowania tylko zwykłą pętlę.
Po co sortować posortowany zbiór? W zadaniu chodzi o to żebyś porównał sobie wydajność różnych algorytmów na różnego typu zbiorach - w ten sposób dowiesz się że niektóre algorytmy są dobre dla wartości losowych ale okazują się złe gdy dane wejściowe już są posortowane lub gdy są one w zupełnie odwrotnej kolejności, dlatego najczęściej stosowane są algorytmy hybrydowe

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