Czemu po takim losowaniu (przyklad z totka ;)):
[code]
Randomize;
For Los := 0 to 99999999 do
begin
For I := 0 to 5 do
begin
// Buff := random(49);
Buff:= RandomRange(0, 49);
BuffInt[Buff] := BuffInt[Buff]+1;
end;
end;
[/code]
kazda z wylosowanych liczb losowana jest od 12240000 do 12255000 razy ??
Wydaje mi sie to troche dziwne, poniewaz chyba powinny byc wieksze rozbieznosci (moze sie myle) ?
Czy oprocz Randomize; jest jakis inny sposob na "wymieszanie" liczb ?
Mysle ze na to pytanie odpowie cos takiego co nazywa sie Krzywa Gauss'a.
--
Umiem troche, ale nie wszystko :) a na koncu i tak BLUE SCREEN
Wydaje mi się że taka rozbieżność wynika z rachunku prawdopodobieństwa i jest właściwa, jednak muszę się zgodzić z faktem że liczby losowane przez Delphi to liczby pseudo losowe.
możesz więc zwiększyć "Pseudo losowość" :-D
np. przez dodatkowe
Delay(random(5));
czy coś w tym rodzaju.
Ok ale jesli zrobie takiego sleepa w tej petli (no bo gdzie indziej ?) to bedzie sie ona wykonywala zbyt dlugo :(
--
Programming, Metal and
Skateboarding is a
source (code) of life.
<font color="black"></span>
Random to rodzaj generatora pseudolosowego. Jeżeli chcesz możesz napisać swoją procedurę generatora pseudolosowego lub wykorzystać jedną ze znanych(von Neumana, multiplikatywny, mieszany, odwracania dystrybuanty). Jest to dość rozległy problem w dużym stopniu związany z symulacją komputerową.
:-) :-) :-)
Proponuję odwołać się do metody kongruencji liniowej czyli sprawdzonego generatora liczb pseudolosowych określonego w następujący sposób:
X[n+1]=(a*X[n]+c) mod m
generowane liczby będą z zakresu 0-(m-1)
a,c,m są dowolnymi parametrami.
Parametrem jest też w szczególności X[1] czyli tak zwane "ziarno" które można (a nawet trzeba) określić za pomocą prawdziwie losowej metody (np. randomize).
pamiętam że wspomnieliśmy (ja i Dryobates) o tej metodzie przy okazji dyskusji "Instrukcja losująca w Asemblerze", która w tej chwili jest na 12 stronie forum.
Pozdrawiam.
<font color="black"></span>
Ja z kolei proponuję:
liniowy(multiplikatywny): xi=(b(xi-1)) mod m
x0,m,b-dowolne
P.S. Do sprawdzenia generatora wykorzystujemy testy(np. chi kwadrat)- kłania się statystyka matematyczna.
Kapustka: Nie wiem czy dobrze mysle, ale:
X := (456Random(346)+5) mod 5) losuje mi liczbe z przedzialu (0-4)
lecz z tego co powiedziales wynika ze:
X := (456Random(346)+20) mod 5)
wylosuje mi liczbe z przedzialu (0-19), a tak naprawde jest ona (0-4).
Moze zle mysle i zle podstawiam, ale jeszcze nigdy nie uzywalem niczego innego poza zwyklym randomize.
I w ogóle jesli pozmieniam reszte parametrow to jakis tam liczb z danego przedzialu w ogóle nie losuje :(
PS. bez bluzgania prosze :-D
--
Programming, Metal and
Skateboarding is a
source (code) of life.
jednak muszę się zgodzić z faktem że liczby losowane przez Delphi to liczby pseudo losowe
Raczej liczby losowane przez komputer (niezaleznie od kompilatora) sa pseudolosowe.
Raczej liczby losowane przez komputer (niezaleznie od kompilatora) sa pseudolosowe.
Dryobates twierdzi ze niekoniecznie. Podobno nowe Pentium potrafia wykorzystac szumy termiczne otoczenia do otrzymywania prawdziwie losowych liczb.
--
Pawel {Delphi 6 Personal}
Po pierwsze: naciśnij F1
Kapustka: Nie wiem czy dobrze mysle, ale:
X := (456Random(346)+5) mod 5) losuje mi liczbe z przedzialu (0-4)
lecz z tego co powiedziales wynika ze:
X := (456Random(346)+20) mod 5)
wylosuje mi liczbe z przedzialu (0-19), a tak naprawde jest ona (0-4).
Moze zle mysle i zle podstawiam, ale jeszcze nigdy nie uzywalem niczego innego poza zwyklym randomize.
I w ogóle jesli pozmieniam reszte parametrow to jakis tam liczb z danego przedzialu w ogóle nie losuje :(
Kaplustka się pomylił. Liczby z przedziału 0 do m-1. W poscie dot. losowania w assemblerze jest to dokładnie przedstawione :)
Co do zmiany rozrzutu w Delphi to można użyć RandSeed.
pq: zgadza się. W instrukcjach SSE 2 coś takiego podobno jest. Jak znajdę w dokumentacji to podam wrzucę na serwer (niestety nie sprawdzę).
--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers.net
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667
Naturalnie pomyłka. (już poprawiłem)
Pozdrawiam.
p.s. na jakiś czas zniknę, gdyż mam fantastyczny projekt do zrealizowania. (może otworzę nim nową dyskusję po powrocie?)
[niewinnosc]
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.