🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

6 total messages Started by Borneq Sun, 28 Jan 2018 22:37
Rozkład odwrotnie proporcjonalny
#309629
Author: Borneq
Date: Sun, 28 Jan 2018 22:37
17 lines
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
#309630
Author: bartekltg
Date: Mon, 29 Jan 2018 04:59
54 lines
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
#309631
Author: Borneq
Date: Mon, 29 Jan 2018 12:11
8 lines
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
#309632
Author: Borneq
Date: Wed, 11 Jul 2018 15:09
46 lines
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
#309633
Author: Wojciech Muła
Date: Thu, 19 Jul 2018 11:57
10 lines
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
#309634
Author: bartekltg
Date: Thu, 19 Jul 2018 13:49
66 lines
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