Dodaj wpis w tym temacie
Spis tematów | Strona: 1 2 ... 11 12 13 ... 30 31 Wyślij wiadomość do admina |
Przewiń wpisy ↓ | Turbo Pascal dla zielonych |
2010-05-26 (02:55) Tajemniczy Don Pedro Data rejestracji: 2009-04-18 00:00:00 Ilość postów: 722 | wpis nr 327 775 [ CZCIONKA MONOSPACE ] Mnie się wydaje, że random będzie w takim zapisie za każdym razem pseudolosowało od nowa. Chętni do nauki są, ale niekoniecznie się odezwą. Nieśmiali są. Ale zobacz na licznik odwiedzin. Mnie osobiście najbardziej interesuje robienie charakterystyk /wykresów/ w TP. Na przykładzie różnych podawanych przez Ciebie generatorów można np. porównać charakterystyki wypadalności powtórek. Ktoś pomyśli, po co mi taki wykres. Mnie chodzi głównie o to, żeby dowiedzieć się jak wygląda w TP program do zrobienia właśnie takiego wykresu. Gdy się konkretnie dowiem jak zrobić taki wykres, łatwo przerobię go na inny, który mnie szczególnie osobiście interesuje. A dlaczego robić specjalny program zamiast ręcznie. Ano dlatego, bo podobnych wykresów potrzebuję robić setki tysięcy w krótkim czasie oraz chcę zaoszczędzić na papierze. Do omawianego przykładu z generatorami do losowania DL proponuję zrobienie programu w TP do wykreślenia charakterystyki: Na osi odciętych program zaznacza czas - czyli ilość kolejnych losowań z generatora, na osi rzędnych ilość powtórek. Można np. porównać wykresy z różnych generatorów oraz obserwować zmiany w miarę narastania ilości losowań. Wreszcie na koniec. Kurko obiecałaś nas tu podszkolić, a ostatnio nie ma programów do wklepania. Generator był w wersji wykonywalnej a gdzie wersja .pas do edycji w TP? |
2010-05-26 (19:35) sindbad Data rejestracji: 2008-10-13 00:00:00 Ilość postów: 20519 | wpis nr 327 928 [ CZCIONKA MONOSPACE ] KURKA, jest tak jak napisałaś, że aktualny wynik korzysta z poprzedniego wyniku, bo z pustego i Salomon nie naleje, ale możemy nadawać wartość ziarna i wtedy wyniki nie są zależne od siebie a np. od zegarka procesora lub czegoś tam innego. |
2010-05-26 (20:24) Tajemniczy Don Pedro Data rejestracji: 2009-04-18 00:00:00 Ilość postów: 722 | wpis nr 327 942 [ CZCIONKA MONOSPACE ] Sindbad, czy to oznacza, że random dział tylko raz w programie a potem zawsze korzysta z tej samej raz pseudo-wylosowanej puli ? Jeśli tak, to jak wykonać w programie np. sto tysięcy prób, skoro to za każdym razem dotyczy tego samego ciągu? Wygląda na to, ze zamiast zajmować się grami losowymi, głównie walczymy obecnie z generatorem. Zdaje się, że nas Kurko wpakowałaś w jakąś kabałę. ;-) |
2010-05-26 (21:11) sindbad Data rejestracji: 2008-10-13 00:00:00 Ilość postów: 20519 | wpis nr 327 953 [ CZCIONKA MONOSPACE ] Może tak zadziałać, jeśli pozostawimy go z wartością stałą, jaką ma przypisaną (ziarno). Generator pseudolosowy Park-Miller Xi = Xi-1 × g mod n Gdzie: Xi ...... generowana, nowa liczba pseudolosowa Xi-1 ... poprzednio wygenerowana liczba pseudolosowa g ....... pierwiastek pierwotny modulo n n ....... liczba pierwsza lub jej potęga X0 ..... ziarno pseudolosowe musi być względnie pierwsze z n |
2010-05-26 (21:46) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 327 968 [ CZCIONKA MONOSPACE ] Random oblicza następną wartość na podstawie poprzedniej . Ale pierwszą wartość musi mieć podaną - to jest ziarno, które można na dwa sposoby zasiać. Albo randomize - pobiera czas systemowy , myślę że w formacie godzina + minuta+sekunda + milisekunda tworząc liczbę od 0 (chyba od zera lub od jeden) do 3600000*h+60000*m+1000*s+*ms = 86 399 999 (jeśli od 1 to do 86,4mln) Być może jeszcze uwzględnia datę i wówczas zakres 1-86,4mln wzrośnie do wymaganych 2^32 = 4,3 mld , ale nie wiem na 100% jak to jest faktycznie. Jeżeli pobiera tylko czas systemowy to Random 32 bitowy składa się z 4,3mld kart ułożonych w okrąg . Pierwsza karta jaką wylosuje to karta ustalona za pomocą randomize czyli od 1 do 86,4mln (sam czas systemowy). Następna karta wynika z równania zastosowanego w random i każda następna jest już określona przez to równanie . Los ma tu coś do powiedzenia tylko w momencie uruchomienia programu - za każdym razem inny \"losowy\" czas , więc inne miejsce na okręgu od którego zaczynamy wybierać karty. Albo randseed (wartość)- gdzie my możemy podać wartość w sposób dosłowny wpisując konkretnie \"100\" czy \"123456\" lub umieszczając tam zmienną. Tutaj miejsce od ktorego zaczynamy wybierać karty możemy określić sami i jeśli to jest stała (konkretna wartość) to za każdym uruchomieniem programu będą te same karty (od tego samego miejsca) wybierane. Do zastosowań w grach losowych nie przydatne. Ale możemy jako wartość podać zmienną np T: randseet(T) zmienna T musi być w jakiś sposób wybierana losowo i może to być odczyt innego czasu nie tego który wykorzystuje randomize , bo wówczas osiągniemy to samo co używając randomize. TDP aby był sens wykonywać miliard losowań, to random trzeba usprawnić , albo skorzystać z własnej funkcji , inaczej losowania tylko z nazwy są losowe By to było jaśniejsze to przykład generatora pseudolosowego który ma 16 (4 bitowy) kart a wartość na kartach to 1 i 0. 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,1 należy połączyć to w okrąg i nie ma wówczas początku (0,1,1...) ani końca (..0,0,1) . Początek ustala nam albo randomize , albo randseed. Jeśli rozpoczniemy od 0,0,0,1..... to po 16-stu losowaniach wracamy do początku i znów losujemy to samo drugi raz. Różnica między jednym a drugim losowaniem - uruchomieniem programu- polega na tym że początek będzie w innym miejscu (i to nie zawsze bo średnio raz na 16-cie uruchomień wystartujemy z tego miejsca co poprzednio). Random ma 32 bity więc nie 16 kart a 4,3mld. Można też zauważyć że nie ma możliwości by wynikiem losowania był ciąg : 0,0,0,0... gdyż karty nie są tak ułożone by mogły (niezależnie od którego miejsca rozpoczniemy) dać taki wynik . Gdybyśmy użyli tego generatora i czekali na serię 4 zer czy jedynek to nigdy by nie wystąpiła, jak również gdybyśmy chcieli zobaczyć jak długo należy losować by wystąpiło powtórnie 1 i 0 to ten czas maksymalnie wyniesie 5 losowań i nigdy więcej W random 32-bitowym , będzie podobna sytuacja i np nigdy nie stwierdzi by była potrzeba losowania 500 mln razy by zostały wylosowane wszystkie szóstki w grze 6z49 Jest to zagadnienie dość ważne bo najpierw musimy mieć świadomość czy da się napisać program liczący sensownie, czy działający dla idei . Zastosowanie pseudosprzętowego generatora mojej konstrukcji wydłuży czas działanie programu do nieakceptowalnego, a i pewności nie mam bo badanie generatora ograniczyłam do 10-ciu prób a nie tysięcy. |
2010-05-26 (22:14) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 327 972 [ CZCIONKA MONOSPACE ] sensownym rozwiązaniem wydaje się takie; 1)uruchamiamy ziarno - randomize 2)następnie odczytujemy z \"zegerka procesora\" czas + wykonujemy odwołanie do karty graficznej + odczytujemy ponownie \"czas procesora\" mamy różnicę = T1 i wartość T1 dzielimy : czas1:= (T1 mod 90) + 10 ; to zajmuje sporo czasu ale niestety. 3)zmienna czas 1 będzie losowo przybierać wartość od 10 do 100 uruchamiamy losowanie: for x:= 10 to czas1 do begin random(ileś tam)+1 end; mamy pierwsze losowania i powiedzmy że początek był od karty nr 1000. jeśli czas1 był obliczony na podstawie T i wyniósł = 55 , to wykonano 55 losowań kart od nr 1000 do 1055. 4)ponownie odczytujemy \"czas procesora\" + itd ale różnicę zapisuje do T2 i dzielę mod 1000 czas2:= (T2 mod 1000) + 100; 5)następnie zmieniam ziarno dodając czas2 co oznacza że przeskakuje z karty nr 1055 nie na następną = 1056 a na kartę o nr większym o czas2 czyli o numerze większym od 100 do 1000. Następnie powrót do punktu nr 2. Cykl wygląda tak : 1)ustalamy początek (ziarno - randomize) 2)ustalamy czas1 3)wykonujemy losowania w ilości określonej przez czas1 4)ustalamy czas2 5)przeskakujemy o ilość losowań określonych przez czas2 6)powrót do punktu 1. Taka konstrukcja pozwala na wycinanie po 10 do 100 losowań pseudolosowych i opuszczanie 100 do 1000 losowań i znów wcięcie kawałka. Długość kawałka i długość odstępu są uzależnione od tego czy czas1 to T1 mod 90 +10 , czy mod 200 + ileś tam To jest wersja mieszana między generatorem moim a random random= szybkość , mój to złów , a ten mix to kompromis. |
2010-05-26 (22:34) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 327 978 [ CZCIONKA MONOSPACE ] Jeżeli czas1 (ilość losowań w jednym kawałku) bedzie od 10 do 100 to średnio statystycznie kawałek to 60 losowań, i na każde 60 losowań przypadają dwa odczyty (w sumie 4 odczyty a dwie różnice T1 i T2) : czas1 i czas2 . Czas losowania 60 losowań za pomocą random to powiedzmy 1ms, czas odczytów różnic T1 i T2 to powiedzmy 2 ms więc random w ciągu 5 ms wykonałby 300 losowań, natomiast proponowana wersja zrobi w ciągu 5 ms tylko 60 losowań, a mój generator w ciągu 5ms zrobiłby tylko 2,5 losowania . Jeśli ustalimy kawałek o większym rozmiarze (średnim rozmiarze) nie na 60 losowań a na 100 to automatycznie w 5ms będzie 500 losowań. Czas 1ms dla 60 losowań podaję tutaj tylko dla przykładu. Można by zrezygnować z drugiego odczytu (T2) i czas2 obliczyć inaczej np: czas2:= T1 mod K gdzie K - to będzie wartość na ostatnio wylosowanej przez random karcie. Pozbędziemy się jednego odczytu więc już nie 5 ms a tylko 3 ms na 60 losowań. |
2010-05-26 (22:37) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 327 983 [ CZCIONKA MONOSPACE ] Errata : to średnio statystycznie bedzie 55 a nie 60 . Niestety ale dziś samopoczucie kiepskie, więcej nic dzisiaj nie wymyślę, głowa boli i kawa nie pomaga. |
2010-05-26 (23:00) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 327 994 [ CZCIONKA MONOSPACE ] Może jedynie dodam jak to w praktyce działa na przykładzie togo4bitowego generatora. 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,1 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 z podanych 16-stu kart wybieramy kawałek (czas1 np od 1 do 3) następnie przeskakujemy (czas2 np d 2 do 5) i co to da : start w pozycji nr 10 ( 10 karta-tak ustalił nam randomize) oraz czas1=3 0,0,1, i dalej było by 1,0,0,1,0,1,1,0,0...itd czyli 10,11,12, i dalej 13,14....itd ale czas2 =5 powoduje przeskok o 5 pozycji i dlatego następna karta będzie : 0,0,1,1, czyli 10,11,12,2, dzięki temu już nie mamy ograniczenia np ; nie może wystąpic seria 4 lub więcej zer czy jedynek. |
2010-05-26 (23:56) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 003 [ CZCIONKA MONOSPACE ] ERRATA przeczytałam i widzę znów błąd. ma być : Cykl wygląda tak : 1)ustalamy początek (ziarno - randomize) 2)ustalamy czas1 3)wykonujemy losowania w ilości określonej przez czas1 4)ustalamy czas2 5)przeskakujemy o ilość losowań określonych przez czas2 6)powrót do punktu 2. punkt 1) jest tylko raz na początku programu. oczywiście jeżeli jesteśmy już przy karcie np dwudziestej od końca (o numerze prawie 4,3mld) to przeskok o 220 do przodu powoduje że skaczemy na kartę nr 200 - jak w powyższym przykładzie skok z karty nr 13 o 5 do przodu to karta nr 2 bo karta nr 18 nie istnieje (18-16=2) |
2010-05-28 (23:38) Amadeus Data rejestracji: 2009-04-30 00:00:00 Ilość postów: 820 | wpis nr 328 585 [ CZCIONKA MONOSPACE ] Witam serdecznie! TDP pisze: \"Takich losowań pełnych cykli należałoby przeprowadzić możliwie wiele. Np. sto tysięcy, czy milion - do wyboru. Komputer można zostawić w razie czego na 2 dni i niech losuje i zapisuje\" \"W rezultacie mielibyśmy wiele ciekawych danych\" TDP i Kurko, wybaczcie, ale oboje wybieracie się tutaj ma manowce. Tematykę losowości i pseudolosowości w kontekście programowania zgłębiłem - powiem bez fałszywej skromności - naprawdę solidnie. Podzielę się teraz swoją wiedzą w tym temacie, by oszczędzić zainteresowanym niepotrzebnej straty czasu na korzystaniu z wadliwych narzędzi i metod. Wróćmy do faktów. Losowania lotto to procesy fizyczne. \"Losowania\" generatora pseudolosowego Pascala to powtarzający się mechaniczny CYKL z którego osobna funkcja \"wycina\" wartości w danym zakresie. \"Zarodek\" (seed) tego generatora ma tylko 32 bity - STANOWCZO za mało, by generować choćby i proste permutacje z więcej niż 12 elementów. ( bibliografia np tutaj: http://www.merlyn.demon.co.uk/pas-rand.htm#All ) Po drugie, pascalowy generator to prymityw, generator tak zwanego typu LCG, już w dwóch wymiarach ukazujący rażące regularności. Odradzam jego stosowanie! Nie jest on w stanie wygenerować godnych zaufania danych SYMULUJĄCYCH losowania. Potrzebny jest generator spełniający następujące warunki: 1. Ogromny stan wewnętrzny, którego nie wyczerpie nawet generowanie milionów cykli do testowania. Jego cykl musi być OLBRZYMI. 2. Równomierny rozkład nawet w przestrzeni wielowymiarowej - dla przykładu, generator Mersenne Twister gwarantuje ekwidystrybucję nawet w więcej niż w 600 wymiarach. Niestety, MT to generator będący baterią modułów-generatorów LFSR, też będących słabymi z punktu widzenia wielu prostych nawet testów losowości. Proponuję generator ISAAC: http://burtleburtle.net/bob/rand/isaacafa.html 8192 bitów stanu wewnętrznego gwarantuje, że generator ten posiada 109074813561941592946298424473378286244826416199623269243183278618972133 184911929521626423452520198722395729179615702527310987082017718406361097 976507755479907890629884219298953860982522804820515969685161359163819677 188654260932456012129055390188630101790025253579991720001007960002653583 680090529780588095235050163019547565391100531236456001484742603529355124 584392891875276869627934408805561751569434994540667782514081490061610592 025643850457801332649356583604724240738244281224513151775751916489922636 574372243227736807502762788304520650179276170094569916849725787968385173 704999690096112051565505011556127149149251534210574896662954703278632150 573082843022166497032439613863525162640951616800542762343599630892169144 618118740639531066540488573943483287742816740749537099351186875635997039 011702182361674945862096985700626361208270671540815706657513728102702231 092756491027675916052087830463241104936456875492096732298245918476342738 379027244843801852697776494107271561158043469082745933999196141424274141 059911742606055648376375631452761136265862838336862115799363802087853767 554533678991569423443395566631507008721353547025567031200413072549583450 835743965382893607708097855057891296790735278005493562156109079584517295 411597292747987752773856000820411855893000477774872776185381351049384058 186159865221160596030835640594182118971403786872621948149872760365361629 885617482241303348543878532402475141941718301228107820972930353737280457 437209522870362277636394529086980625842235514850757103961938744962986680 818876966281577815307939317909314364834076173858181956300299442279075495 506128881830843007964869323217915876591803556521615711540299212027615560 787310793747746684152836298770869945015203123186259420308569383894465706 134623670423402682110295895495119708707654618662279629453645162075650935 101890602377382153953277620867697858973196633030889330466516943618507835 064156833694453005143749131129883436726523859540490427345592872394952522 718461740436785475461047437701976802557660588103807727070771794222197709 038543858584409549211609985253890397465570394397308609093059696336076752 996493841459818570596375456149735582781362383328890630900428801732142480 866396267133352800923275835087305961411872378142210146019861574738685509 689608918918044133955852482286754111321263879367556765034036297003193002 339782846531854723824423202801518968966041882297600081543761065225427016 359565087543385114712321422726660540358178146909080657646895058766199718 6505665475715792896 unikatowych zarodków (seedów), z których każdy generuje unikatowy ciąg wyjściowy. Stanowczo więcej niż nędzne 4294967295 stanów osiągalnych przez wbudowany generator Pascalowy. Doskonałe implementacje algorytmów krypotograficznych i matematycznych dla Pascala/FreePascala/Delphi tworzy znakomity niemiecki programista, Wolfgang Ehrhardt. http://home.netsurf.de/wolfgang.ehrhardt/index.html Wśród nich są trzy biblioteki mogące okazać się niezwykle przydatne dla analityków lotto (tak, jak okazują się być przydatne w moich badaniach). Są to: - biblioteka Math: http://home.netsurf.de/wolfgang.ehrhardt/misc_en.html#amath - biblioteka MPArith: http://home.netsurf.de/wolfgang.ehrhardt/misc_en.html#mparith - biblioteka PRNG: http://home.netsurf.de/wolfgang.ehrhardt/misc_en.html#prng Dwie pierwsze biblioteki to wszechstronne arsenały funkcji i procedur matematycznych. PRNG to biblioteka procedur pseudolosowych, zawiera implementacje różnych generatorów, w tym ISAAC\'a. Jako generator klasy CSPRNG (bezpieczny kryptograficznie) ISAAC zapewnia rozkład jednolity w dowolnej ilości wymiarów. Skoro mamy już solidny generator pseudolosowy, jest do rozważenia druga kwestia, równie ważna: inicjowanie stanu wewnętrznego. Należy z góry zapomnieć o inicjacji zegarem komputera, niezależnie od jego częstotliwości pracy. Liczy się rozmiar jego stanu, a ten nie osiągnie nawet wartości 128 bitów. ISAAC potrzebuje 8192 bitów! W \"czystym\" DOSie zastosować można prostą sztuczkę, dostarczającą nam sporo \"losowości\" w tym kontekście rozumianej jako dużo nieprzewidywalnych danych-\"śmieci\" do wytworzenia z nich zarodka generatora. Ja stosowałem metodę polegającą na tym, że pamięć niską DOS - 640 kilobajtów - przepuszczałem raz po razie przez kryptograficzną funkcję has***ącą - np Whirlpool - i za każdym razem odkładałem do osobnego bufora wynik, aż uzyskiwałem 8192 bity. Pamięć operacyjna jest ogromnie \"zaśmiecona\", pełno w niej trudno przewidywalnych, wciąż zmieniających się wartości, a to właśnie jest to, czego nam potrzeba. Solidna biblioteka funkcji has***ących jest także dostępna na stronie W. Ehrhardta. Dla osób bardziej obytych z DOSem rozwiązaniem jest sterownik losowości NOISE.SYS - próbkuje on wszelkie wydarzenia systemowe i na podstawie ich precyzyjnego próbkowania generuje losowość, jaką można zasilić stan wewnętrzny wybranego generatora. ftp://ftp.funet.fi/pub/crypt/random/noise063.zip Dla osób piszących dla Windows w Delphi polecam napisanie interfejsu do przepięknego generatora HAVEGE - śmiem twierdzić, że w chwili obecnej stanowi on najbardziej kompetentne i godne zaufania źródło losowości. http://www.irisa.fr/caps/projects/hipsor/ Kurka pisze: \"Kto jest w stanie sprawdzić i ocenić czy będą to wyniki lepsze niż daje generator pseudolosowy ???\" Odnoszenie się do kolejnych wartości zegara, nawet z \"nieprzewidywalnymi\" interwałami czasowymi pomiędzy kolejnymi próbkowaniami NIE zapewnia wystarczającej jakości uzyskiwanej \"losowości\" do inicjacji generatorów pseudolosowych. Kurka pisze: \"Jak połączymy początek z końcem , to mamy łańcuch zapięty i nie ma już ani początku , ani konca. \" Doskonale to ujęłaś. A niestety, wbudowane w język generatory mają ten łańcuch bardzo krótki - za krótki do celów symulacji lotto. sindbad pisze: \"Moim zdaniem funkcja random() jest wystarczająca do zabawy z Lotto\" STANOWCZO nie jest. Dowód na stronie J. R. Stocktona, której adres podałem powyżej. TDP pisze: \"Mnie się wydaje, że random będzie w takim zapisie za każdym razem pseudolosowało od nowa. \" Nie. Jeżeli programista nie wywoła \"Randomize;\" więcej niż raz, kolejne wartości pseudolosowe są po prostu wyliczane na podstawie kolejnych \"ogniw\" w zamkniętym łańcuchu wartości kolejnych wartości randseed. sindbad pisze: \"Generator pseudolosowy Park-Miller\" Też należy do rodziny generatorów LCG. Także nie nadaje się do poważnych zastosowań. Odradzam. Kurka pisze: \"Jeżeli pobiera tylko czas systemowy to Random 32 bitowy składa się z 4,3mld kart ułożonych w okrąg . Pierwsza karta jaką wylosuje to karta ustalona za pomocą randomize czyli od 1 do 86,4mln (sam czas systemowy).\" \"Wycinków łańcucha\" będzie TYLKO tyle, ile unikatowych stanów przybiera zegar systemowy. A stanów tych jest nawet mniej niż 2^32, więc tym bardziej ograniczona jest przestrzeń zarodków generatora. Uciekajmy z tych rejonów czym prędzej! Kurka pisze: \"TDP aby był sens wykonywać miliard losowań, to random trzeba usprawnić , albo skorzystać z własnej funkcji\" Zgadzam się z Tobą całkowicie. Trzymajmy się z daleka od kalekich generatorów wbudowanych w język. Ja poleciłem ISAAC, ze względu na jego przynależność do klasy generatorów kryptograficznie bezpiecznych. Proponuję też połączenie silnego generatora z metodą bazującą na udziale i interwencji człowieka w proces algorytmiczny (tylko dla małych ilości losowań, np jako własne chybił-trafił. Posłużę się pascalopodobnym pseudokodem. Występują: funkcja isaacrand32: zwraca 32bitowy \"longint\" wygenerowany przez ISAAC. funkcja randCSN: zwraca losowy kod CSN kombinacji, który możemy konwertować na kombinację (kod konwertera kombinacja<=>CSN w Pascalu/Delphi podałem na forum Saliu jako Nanhajir). zmienna x: longint; function randCSN:Longint; begin repeat repeat x := isaacrand32; { wygeneruj kolejną 32bitową liczbę } until (x>0) and (x<16983817); { czy mieści się w zakresie kodów CSN DL? } until keypressed; { Czy naciśnięto jakiś klawisz? } randCSN:=x; end; Opis: wewnętrzna pętla generuje ISAAC\'em kolejne 32bitowe liczby \"sobie a muzom\" tak długo, aż któraś z nich mieści się w zakresie kodów CSN DL (1-13983816). Wtedy wygenerowana liczba opuszcza wewnętrzną pętle i trafia do pętli zewnętrznej, która powtarza pętle wewnętrzną, chyba, że \"user\" naciśnie jakiś klawisz. Jeśli tak się stanie, ostatnio wygenerowana liczba mieszcząca się w zakresie CSN dla DL zostaje wyemitowana jako wynik funkcji. W tej metodzie mamy zarówno solidną pseudolosowość z godnego zaufania generatora, jak i element nieprzewidywalności wyższego rzędu - użytkownik programu staje się \"sierotką\" dla generatora Oczywiście pamiętajmy o porządnym źródle \"seeda\" do naszego generatora! Kilka propozycji w tym zakresie podałem. Kurka, napisz do mnie na priv, ogromnie podoba mi się Twój wysiłek oświatowy na tym forum i chętnie wspomogę Twoje prace, chociażby dzieląc się z Tobą już gotowymi rozwiązaniami z mojego warsztatu. Mówimy wspólnym językiem (Pascal/Delphi), co na pewno ułatwi współpracę. Przy okazji Ciebie i innych rozmówców przepraszam za zdawkowość niektórych moich wypowiedzi, ale jestem obecnie ogólnie zajęty i czasami trudno mi pisać tak szeroko, jak sam bym chciał. Pozdrawiam ciepło! Amadeus |
2010-05-29 (01:49) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 592 [ CZCIONKA MONOSPACE ] No Amadeus, szczęka opada Random z pascala jak widać nadaje się przede wszystkim do nauki , jak i sam pascal - najlepszy język do nauczania początkowego. Sinbad przeprowadził 18-ście symulacji i średnia to 230mln losowań by wszystkie szóstki w Lotto były wylosowane. Odchylenie = 14mln Ja zrobiłam 18-ście symulacji zmodyfikowanym Random i średnia to 245mln oraz odchylenie= 31mln Można przyjąć , że ze względu na ułożenie kart - nigdy random nie osiągnie podczas takiej symulacji wyniku w granicach 50mln losowań , czy nawet 100mln losowań a jest to możliwe w rzeczywistości. Tak na marginesie - można by obliczyć ile według RP potrzeba losowań by wylosowane były wszystkie szóstki i jakie jest \"p\" przy danej ilości losowań. Wówczas mamy średnią i ciekawe czy będzie ona bliżej 230ml czy bliżej 245mln ??? Może napiszemy ten program który liczy ilość losowań do momentu kiedy to wszystkie szóstki wypadną - przecież wątek jest o podstawach, więc do tego programu wystarczy to co już wiemy. Możemy problem przedstawić jako algorytm . 1) losujemy szóstkę 2) zapisujemy ją 3) sprawdzamy czy wszystkie szóstki już są 4) jeśli są to koniec i wyświetlamy ilość losowań jeśli nie to wracamy do punktu 1. AD1) randomize; x:=random(13983816)+1; inc(licznik); AD2) tab[x]:=tab[x]+1; ( lub inc(tab[x]; ) AD3 pętla od 1 do 13983816 sprawdza pozycję tabeli \'tab\' i jeśli w którejkolwiek jest zero to: AD4) zero to losujemy dalej - powrót do ponktu 1. nie ma zera to koniec i licznik jest wynikiem. Teraz poskładać do kupy i gotowe- wersja najprostsza ,mało efektywna ale zrozumiała. |
2010-05-29 (02:11) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 593 [ CZCIONKA MONOSPACE ] Jak widać z podpowiedzi , algorytm zawarty w 4 punktach można rozwinąć ; 1) losujemy szostkę 2) zwiększamy licznik losowań (który jest naszym poszukiwanym wynikiem) 3) zapisujemy wylosowaną szóstkę to tablicy - a dokładniej to fakt jej wystąpienia , czyli wartość w tablicy pod adresem szóstki zwiększamy +1. 4) sprawdzamy całą tablicę przy pomocy pętli 4a) rozpoczynamy pętlę - 1 do 13983816 - (zmienna pomocnicza \'pom\') 4b) sprawdzamy wartość w tablicy pod adresem [pom] od 1 do 13983816 4c) jeżeli któraś z watości sprawdzanych =0 to powrót do p 1 4d) jeżeli nie ma zera to koniec i wyświetlamy licznik- wynik. jest:=1; randomize; repeat x;=random(13983816)+1; inc(licznik); inc(tab[x]); for pom:=1 to 13983816 do begin if tab[pom]=0 then jest:=0; end; until jest =1; writeln(licznik); readln; end. Zmienna \"jest\" bada czy jest zero tabeli \"tab\" co znaczy że brakuje szóstki. Jeżeli będą wszystkie szóstki to zmienna \'jest\' będzie równa 1 i zakończy się pętla repeat - until jest=1 |
2010-05-29 (02:38) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 594 [ CZCIONKA MONOSPACE ] Pętla for - używa się jej gdy dokładnie wiemy ile razy ma się wykonać Pętla Repeat-until - gdy nie wiemy ile razy . do sprawdzenia czy wypadły wszystkie szóstki użyta jest pętla for - prawdza wszystkie szóstki - znana wielkość. ale czy musi sprawdzać wszystkie ? - to trwa , a po kazdym losowaniu musimy sprawdzać - czy na pewno po każdym ??? |
2010-05-29 (02:43) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 595 [ CZCIONKA MONOSPACE ] Zobaczcie , 100 mln losowań i po każdym sprawdzenie 14mln szóstek. to jest 100mlnx14mln= kosmiczna cyfra sprawdzeń. należy to ograniczyć , ale nie kosztem dokładności , tylko poszukać innych możliwości. najłatwiejsza : można losować prawie 14mln bez sprawdzania bo na 100% nie będzie wszystkich szóstek po 100 losowaniach czy 13mln losowań. |
2010-05-29 (02:48) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 596 [ CZCIONKA MONOSPACE ] następna sprawa i o wiele ważniejsza to : Jeżeli sprawdzamy pierwszą szóstkę i jej jeszcze nie ma to nie ma sensu dalsze sprawdzanie , ponieważ już jednej brakuje. Napiszemy (w najbliższych godzinach ) program który bierze te poprawki pod uwagę. |
2010-05-29 (11:34) sindbad Data rejestracji: 2008-10-13 00:00:00 Ilość postów: 20519 | wpis nr 328 650 [ CZCIONKA MONOSPACE ] Można też w locie sumować ilość różnych szóstek. repeat x:=random(13983816)+1; inc(licznik); if tab[x]=0 then begin inc(tab[x]); inc(jest); end; until jest=13983816; |
2010-05-29 (12:07) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 658 [ CZCIONKA MONOSPACE ] Simbad od razu zaproponował najszybszy sposób Ale jest nieco inny algorytm . poprzedni algorytm to tok myślenia (powolny ): 1)losujemy szóstkę 2)sprawdzamy wszystkie szóstki czy już są wszystkie i jeśli nie ma wszystkich to losujemy dalej. następnie tok myślenia (i algorytm) zmieniamy na (szybszy): 1)losujemy szóstkę 2)sprawdzamy kolejne szóstki i jeśli którejś nie ma kończymy sprawdzanie i losujemy dalej. oraz tok myślenia Sindbada (szybki): 1)losujemy szóstkę 2) zaznaczamy że jedna (kolejna) już jest więc ilość wylosowanych dąży do 13983816 za każdym kolejnym losowaniem i jeśli osiągnie 13983816 to oznacza że są wszystkie. Zrobimy po kolei wszystkie 3 wersję po to by zobaczyć różnicę w czasie wykonywania się programu. |
2010-05-29 (17:05) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 743 [ CZCIONKA MONOSPACE ] Wersja I : licznik ustawiamy na \"0\" zmienną jest na \"1\" pętla repeat - until jest=1 wykonuje się tyle razy , aż zmienna jest będzie miała wartość 1 w tym czasie licznik zwiększa się za każdym wykonaniem się pętli i mówi nam o ilości losowań. losujemy X i w tablicy pod adresem tab[x] zwiększamy wartość o 1. Na początku w tablicy pod każdym adresem jest zero. jeżeli jako pierwsze X wylosujemy 100 to następnie w tablicy o nr 100 zwiększymy wartość z zera na jeden. progam po wylosowaniu X przechodzi do pętli for tam zmienna pomocnicza przybiera wartości od 1 do prawie 14mln - co pozwala na odwiedzenie po kolei wszystkich adresów w tablicy. w czasie odwiedzin sprawdzamy co jest pod każdym adresem i jeżeli będzie tam zero to zmienna \"jest\" przybiera wartość =0 if tab[pom] =0 then jest:=0; Sprawdzamy prawie 14mln adresów w tabeli ( całą tabelę). na koniec pętli repeat sprawdzamy czy zmienna \"jest\" równa się \"1\", co oznacza że w całej tablicy nie było żadnego zera. Jeśli nie było zera i zmienna \"jest\" = 1 to mamy koniec. jeśli było zero to program wraca do losowania X W tabeli cały czas mamy ilość wystąpień poszczególnych szóstek (X) zapisanych w 13983816 adresach tabeli. |
2010-05-29 (19:08) KURKA Data rejestracji: 2009-01-23 00:00:00 Ilość postów: 2551 | wpis nr 328 760 [ CZCIONKA MONOSPACE ] Wersja II W pierwszej wersji sprawdzaliśmy wszystkie adresy tabeli , tutaj sprawdzamy tylko do momentu wykrycia \"braku szóstki\". różnica polega na tym że wcześniej po każdym losowaniu sprawdzaliśmy wszystkie, 14mln (prawie) a teraz jeśli pod adresem nr 7 czy 120 nie ma szóstki to nie sprawdzamy 14 mln a tylko 7 czy 120. cdn. |
| Dodaj wpis w tym temacie | Spis tematów | Wyniki lotto | Strona: 1 2 ... 11 12 13 ... 30 31 Wyślij wiadomość do admina |