Thread View: pl.comp.lang.c
6 messages
6 total messages
Started by Borneq
Sun, 28 Jan 2018 22:37
Rozkład odwrotnie proporcjonalny
Author: Borneq
Date: Sun, 28 Jan 2018 22:37
Date: Sun, 28 Jan 2018 22:37
17 lines
1526 bytes
1526 bytes
Weźmy rozkład zwykły:
default_random_engine dre(random_device{}());
uniform_int_distribution<int> id(10, 1000);
this_thread::sleep_for(chrono::milliseconds(id(dre)));
tutaj średni czas będzie wynosił 550 ms
Co bym chciał zrobić:
rozkład, gdzie czas 1000 ms występuje 10 razy rzadziej niż 100 ms, a
jeszcze mniejszy czas, częściej.
Czy do tego wystarczy rozkład Poissona
http://en.cppreference.com/w/cpp/numeric/random/poisson_distribution
std::random_device rd;
std::mt19937 gen(rd());
std::poisson_distribution<> d(4);
d(gen)
Jakie znaczenie ma liczba 4? Jest to wartość najczęściej występująca i
może losować liczby zmiennoprzecinkowe np. 3.5 ?
Re: Rozkład odwrotnie proporcjonalny
Author: bartekltg
Date: Mon, 29 Jan 2018 04:59
Date: Mon, 29 Jan 2018 04:59
54 lines
3312 bytes
3312 bytes
On Sunday, January 28, 2018 at 11:37:31 PM UTC+1, Borneq wrote:
> Weźmy rozkład zwykły:
> default_random_engine dre(random_device{}());
> uniform_int_distribution<int> id(10, 1000);
> this_thread::sleep_for(chrono::milliseconds(id(dre)));
>
> tutaj średni czas będzie wynosił 550 ms
> Co bym chciał zrobić:
> rozkład, gdzie czas 1000 ms występuje 10 razy rzadziej niż 100 ms, a
> jeszcze mniejszy czas, częściej.
Trochę ścisłości by nie zaszkodziło;p
Jaki ma być ten rozkład? Na jakim przedziale?
To ile ma byc dla tych mniejszyhc czasów?
dla 10ms jeszcze 10 razy wiecej?
> Czy do tego wystarczy rozkład Poissona
Dowiemy się, jak przedstawisz założenia.
Ale ten rozkład jest
-dyskretny (daje lcizby całkowite)
-ma górkę, a nie jest malejący.
Pewnie byś raczej chaił wykładniczy
https://en.wikipedia.org/wiki/Exponential_distribution
(czy jego dyskretny odpowiedniek - geometryczny, oba są w <random>)
Bezpośrednio to o czym mówisz, czyli aby prawdopodobieństwo
było odwrotnie proporcjonalne do wyniku, mamy tutaj:
https://en.wikipedia.org/wiki/Reciprocal_distribution
Ale _musisz_ mieć oba ograniczenia, dolne i gorne (1/r
jest niecałkowalne i do 0, i do nieskonczoności)
i te zakresy zdeterminują średnią.
Rozkładu nie widzę ani w std, ani booscie, ale mozesz
sobie metodą odwrotnej dystrybuanyt wlasny zrobić.
> http://en.cppreference.com/w/cpp/numeric/random/poisson_distribution
> std::random_device rd;
> std::mt19937 gen(rd());
> std::poisson_distribution<> d(4);
> d(gen)
> Jakie znaczenie ma liczba 4?
> Jest to wartość najczęściej występująca i
> może losować liczby zmiennoprzecinkowe np. 3.5 ?
A otworzyłeś choćby wikipedię na hasło rozkłąd Poissona?
Nie, parametr lambda jest rzeczywisty, ale rozkład
generuje liczby całkowite.
pzdr
bartekltg
Re: Rozkład odwrotnie proporcjonalny
Author: Borneq
Date: Mon, 29 Jan 2018 12:11
Date: Mon, 29 Jan 2018 12:11
8 lines
1367 bytes
1367 bytes
W dniu 29.01.2018 o 05:59, bartekltg pisze: > Pewnie byś raczej chaił wykładniczy > https://en.wikipedia.org/wiki/Exponential_distribution Nie wiem, musiałbym porobić testy. Chciałbym aby był jakoś malejący dla dużych czasów, ale na razie nie jestem pewien z jaką prędkością. Obiecujący jest Poisson, tylko że jak widzę, zbyt gromadzi wartości blisko Lambda i za mały rozrzut.
Re: Rozkład odwrotnie proporcjonalny
Author: Borneq
Date: Wed, 11 Jul 2018 15:09
Date: Wed, 11 Jul 2018 15:09
46 lines
2368 bytes
2368 bytes
W dniu 29.01.2018 o 06:59, bartekltg pisze:
> Trochę ścisłości by nie zaszkodziło;p
> Jaki ma być ten rozkład? Na jakim przedziale?
> To ile ma byc dla tych mniejszyhc czasów?
> dla 10ms jeszcze 10 razy wiecej?
Mam
float randFloat(float a, float b)
{
double x = (double)rand() / RAND_MAX;
return x*(b-a)+a;
}
RAND_MAX to znaczy maksymalnie możliwa wartość a nie o 1 większa.
Mam trzy progi, i o wiele lepiej niż z dwoma:
double alpha;
int n = rand() % 100;
if (n==0)
alpha = randFloat(-100, 100);
else if (n < 10)
alpha = randFloat(-10, 10);
else
alpha = randFloat(0,1);
Teraz chciałbym zastąpić to jednym rozkładem.
Można wyobrazić sobie większą ilość progów:
double alpha;
int n = rand() % 64;
if (n<1)
alpha = randFloat(-64, 64);
else if (n<2)
alpha = randFloat(-32, 32);
else if (n<4)
alpha = randFloat(-16, 16);
else if (n<8)
alpha = randFloat(-8, 8);
else if (n<16)
alpha = randFloat(-4, 4);
else if (n<32)
alpha = randFloat(-2, 2);
else
alpha = randFloat(-1, 1);
Trochę inaczej mi wyszło, bo w większości wypadków powinno być z
przedziału (0,1) ale chodzi o coś takiego
poza tym przedział pierwszy i drugi są jednakowe a każdy powinien być
dwa razy dłuższy,to znaczy wydłużanie się przedziałów powinno być ciągłe.
Re: Rozkład odwrotnie proporcjonalny
Author: Wojciech Muła
Date: Thu, 19 Jul 2018 11:57
Date: Thu, 19 Jul 2018 11:57
10 lines
2006 bytes
2006 bytes
On Wednesday, July 11, 2018 at 5:09:33 PM UTC+2, Borneq wrote: > Trochę inaczej mi wyszło, bo w większości wypadków powinno być z > przedziału (0,1) ale chodzi o coś takiego > poza tym przedział pierwszy i drugi są jednakowe a każdy powinien być > dwa razy dłuższy,to znaczy wydłużanie się przedziałów powinno być ciągłe. Popatrz na: https://en.cppreference.com/w/cpp/numeric/random/discrete_distribution Ustawiasz sobie dowolne prawdopodobieństwa dla zbioru liczb całkowitych. w.
Re: Rozkład odwrotnie proporcjonalny
Author: bartekltg
Date: Thu, 19 Jul 2018 13:49
Date: Thu, 19 Jul 2018 13:49
66 lines
3152 bytes
3152 bytes
On 11.07.2018 17:09, Borneq wrote:
> W dniu 29.01.2018 o 06:59, bartekltg pisze:
>> Trochę ścisłości by nie zaszkodziło;p
>> Jaki ma być ten rozkład? Na jakim przedziale?
>> To ile ma byc dla tych mniejszyhc czasów?
>> dla 10ms jeszcze 10 razy wiecej?
>
> Mam
> float randFloat(float a, float b)
> {
> double x = (double)rand() / RAND_MAX;
> return x*(b-a)+a;
> }
>
> RAND_MAX to znaczy maksymalnie możliwa wartość a nie o 1 większa.
> Mam trzy progi, i o wiele lepiej niż z dwoma:
> double alpha;
> int n = rand() % 100;
> if (n==0)
> alpha = randFloat(-100, 100);
> else if (n < 10)
> alpha = randFloat(-10, 10);
> else
> alpha = randFloat(0,1);
> Teraz chciałbym zastąpić to jednym rozkładem.
> Można wyobrazić sobie większą ilość progów:
> double alpha;
> int n = rand() % 64;
> if (n<1)
> alpha = randFloat(-64, 64);
> else if (n<2)
> alpha = randFloat(-32, 32);
> else if (n<4)
> alpha = randFloat(-16, 16);
> else if (n<8)
> alpha = randFloat(-8, 8);
> else if (n<16)
> alpha = randFloat(-4, 4);
> else if (n<32)
> alpha = randFloat(-2, 2);
> else
> alpha = randFloat(-1, 1);
>
> Trochę inaczej mi wyszło, bo w większości wypadków powinno być z
> przedziału (0,1) ale chodzi o coś takiego
> poza tym przedział pierwszy i drugi są jednakowe a każdy powinien być
> dwa razy dłuższy,to znaczy wydłużanie się przedziałów powinno być ciągłe.
Losujesz liczbę X z (0,64);
Patrzysz, w który przedział wpadła:
(0,1), (1,2), (2,4)... (32..64)
i w zależnośći, w który wpadł, przeskalowujesz ją
na odpowiedni zakre.
Np jeśli liczba jest w zakresie (2,4), chcesz, aby wpadła
w (-16,16). więc alpha = (X-3)*16
Rozkłąd jest taki sam. Czasem tracisz trochę bitów
znaczacych,a le neiwiele.
Czy będzto szybsze... niekoniecznie, zależy od generatora, sprawdź.
pzdr
bartekltg
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads