[Delphi] czy random nie kłamie ?

0

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 ?

0

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

0

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.

0

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.

0

<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ą.

:-) :-) :-)

0

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.

0

<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.

0

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 := (456
Random(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.

0

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.

0

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

0

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 := (456
Random(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

0

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]

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