Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Pascal] Program losujący 5 liczb bez powtórzeń.

Saviko 19 Lis 2017 21:28 723 8
  • #1 19 Lis 2017 21:28
    Saviko
    Poziom 12  

    Witam, otóż muszę napisać program, który będzie losować 5 liczb bez powtórzeń z zakresu <100;999>. Używam do tego tablicy jednowymiarowej oraz pętli for. Ogólnie kryteria dosyć drastyczne, bez żadnych funkcji oraz innych udziwnień.

    Losowanie 5 liczb jest banalne, jednak jak ująć w kodzie ponowne losowanie lub pominięcie tej liczby, gdy wylosuje taką samą? W tym zakresie prawdopodobieństwo powtórzenia jest minimalne, jednak kryteria.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Wszystko robię w Delphi7, jakieś nakierowanie? Pomysły? Jestem początkujący. :)

    0 8
  • #2 19 Lis 2017 22:20
    muzeum
    Poziom 9  

    Tab[i]:=Random(899)+100; zamiast od razu wpisywać do tablicy to dodaj jeszcze jedną pętlę (pętla w pętli),i w niej ifa który sprawdzi czy ta liczba nie została już wylosowana

    0
  • #4 20 Lis 2017 09:24
    kinggustav
    Poziom 20  

    Niezupełnie. Najpierw losujesz element j, potem sprawdzasz czy nie ma powtórzeń, czyli czy nie ma go już w tablicy. Nie sprawdzaj przy tym z samym sobą, bo wyjdzie powtórzenie. Do tego lepsza będzie pętla while, bo w przypadku znalezienia może się zakończyć i wszystko już wiesz.
    Porównywanie if Tab[i]=j wydaje się bez sensu, nie porównuje się jabłek z gruszkami, więc albo liczby albo ich indeksy.

    0
  • #5 20 Lis 2017 11:57
    kemot55
    Poziom 30  

    A nie można użyć własnego algorytmu do losowania. Trochę tego jest, głównie oparte o liczby pierwsze. Sam generator może już zapewnić wylosowanie bez powtórzeń.

    0
  • #6 20 Lis 2017 19:25
    JacekCz
    Poziom 36  

    kemot55 napisał:
    A nie można użyć własnego algorytmu do losowania. Trochę tego jest, głównie oparte o liczby pierwsze. Sam generator może już zapewnić wylosowanie bez powtórzeń.


    Chyba matematycy by się oburzyli.
    Cos takiego na pewno jest możliwe, ale to nie jest rozkład losowy

    0
  • #7 20 Lis 2017 21:23
    kemot55
    Poziom 30  

    A jak myślisz na czym oparta jest funkcja Random?
    Praktycznie wszystko softwarowe ma charakter pseudolosowy. Można kombinować z początkiem (ziarnem), ale wcześniej czy później skończy się na mnożeniu dodawaniu i operacji reszty z dzielenia.
    Spróbuj ze zbioru 4 miliardów liczb (32 bity) wybrać wszystkie w pseudolosowym porządku bez powtórzeń. Albo żeby było śmieszniej to weźmy rejestr 64 bitowy.

    0
  • #8 21 Lis 2017 08:36
    JacekCz
    Poziom 36  

    Rzucamy monetą.
    Trzy razy wypadła reszka
    jakie jest teraz prawdopodobieństwo, że wypadnie reszka i orzeł.

    a) na chłopski rozsądek
    b) matematycznie

    0
  • #9 21 Lis 2017 08:56
    kinggustav
    Poziom 20  

    Trochę się pogubiłem: szukasz pomocy w napisaniu w miarę prostego programu losującego a masz ochotę implementować jakieś własne algorytmy losowania? To w końcu umiesz programować czy nie? Potrafiłbyś przetestować taki algorytm?
    Dostarczona funkcja losująca jest taka, bo ma być uniwersalna. Jej wada: sam musisz się pozbyć powtórzeń, nie przeszkadza aż tak bardzo, żeby coś zmieniać. Oczywiście można pisać własne algorytmy, ale tylko wtedy, gdy masz szansę zrobić to lepiej (lub w celach czysto dydaktycznych). Czy to by było lepiej? Chyba nie, koledzy wytłumaczyli już dlaczego. A nie doszliśmy jeszcze do ciekawych kwestii wydajnościowych.

    0