matematykaszkolna.pl
. asdf: Programowanie, srand(): dlaczego jak wezme wywolam taka petle: for(m=0;m<50;m++){ srand(time(NULL)); printf("%d, %d, ",rand()%50, rand()%25); if( ((m%10))== 9){ puts("\n"); } } to mam ciagle te same liczby, a jak, taka: srand(time(NULL)); for(m=0;m<50;m++){ printf("%d, %d, ",rand()%50, rand()%25); if( ((m%10))== 9){ puts("\n"); } } to mam losowe?
5 wrz 14:37
Vizer: W pierwszej pętli cały czas ustawiasz czas na 0, więc losuje tak samo cały czas. Bo to losowanie srand() jest pseudolosowe, a nie przypadkowe.
5 wrz 14:45
asdf: aha...i wywolanie rand() po zdeklarowaniu czasu na zero jest ciagle takie same, wiec "wylosuje" tą samą liczbe, tak?
5 wrz 14:56
Vizer: dokładnie emotka
5 wrz 14:56
tn: Tak, bo tam jest seed (ziarno) w oparciu o które następuję losowanie.
5 wrz 15:48
asdf: ok, a gdybym przekazywał wskaźnik na strukture to mialbym ciagle też tą samą wartość?
5 wrz 16:27
Trivial: srand() ustawia ziarno generowania ciągu liczb losowych. W całym programie powinno wywołane być tylko raz − przed użyciem rand(); Dla testów można użyć jakiejś stałej wartości − wynik działania programu po każdym uruchomieniu będzie taki sam − np.: srand(47). Wywołanie srand(time(NULL)) inicjuje ziarno bieżącym czasem.
5 wrz 19:13
Trivial: A co do wskaźnika do time_t jako argument funkcji time(): time_t czas; time(&czas); jest równoważne: time_t czas = time(NULL);
5 wrz 19:19
asdf: dzieki Dzisiaj jeszcze usiądę przed kodem i będę chcial napisac algorytm wygrywania pomiedzy dwoma zespolami, gdzie wplyw ma wspolczynnik wygranej, pomysl mam taki: rate1 = wspolczynnik wygrania druzyny 1 rate2 = wspolczynnik wygrania druzyny 2 stworzyc funkcje: int game(int rate1, int rate2){ rate1 = rand()%rate1; rate2 = rand()%rate2; if(rate1 > rate2){ return 1; } else if(rate 1< rate2){ return −1; } else { return 0; } } int finalResult(double procent1,double procent2,double procent3){ procent1 = procent1; procent2 = procent1 + procent2; procent3 = 100; int result = rand()%100 + 1; if( result > 0 && result < procent1){ printf("wygrala pierwsza druzyna"); } else if( result >= procent1 && result < procent2){ printf("wygrala druga druzyna"); } else { printf("remis!"); } } void dropResult(int rate1, rate2){ double procent1 = 0; //ze wygra druzyna 1 double procent2 = 0; //ze wygra druzyna 2 double procent3 = 0; // ze bedzie remis int drop; for(int i = 0;i<100;i++){ drop = game(rate1,rate2); if(drop > 0){ procent1++; } else if(drop < 0){ procent2++;} else { procent3++;} } finalResult(procent1,procent2,procent3); } Ostatecznie zbieranie jakie jest procent na remis bylo zbedne, ale juz nie bede motac w kodzie
5 wrz 20:45
asdf: Jestem swiadomy tego, ze pisze troche nie zrozumiale ten kod, ale pewnie Ty sie w tym wszystkim polapiesz , ale wyjasnie o co mi w tym wszystkim chodzi: bierzemy, np. wynik = game(10,10), losujemy to 100 razy, wynik ostateczny jest taki: procent1 = 37; procent2 = 37; procent3 = 25; tam z hakiem, dlatego suma = 99; finalResult − pobieramy te liczby: finalResult(37,37,25) procent1 = 37 (przedzial od 0 do 37) procent2 = 37+37 (przedzial od 38 do 74) procent3 = reszta..czyli 100 − ten jeden procent dam wiecej na remis. teraz ponownie losuje jakas liczbe z przedzialu 0 do 100, jezeli trafie na: 0−37::wygra druzyna 1; 38−74::wygra druzyna 2; inaczej::remis! Jest to ok A moze masz pomysl na jakis inny algorytm
5 wrz 20:51
asdf: kurde, zle to zabrzmialo...chcialem sie spytac: A moze macie..chodzi o pytanie do wszystkich
5 wrz 20:53
asdf:
5 wrz 21:43
asdf: rytyty!emotka
5 wrz 22:42
asdf:
6 wrz 00:43
Trivial: asdf, przeczytałem uważnie Twoje posty. Niestety z opisu słownego nie wiem, co chcesz osiągnąć, a kod tego jasno nie komunikuje. Może zacznij od jasnego zdefiniowania celu.
6 wrz 16:49
asdf: Robie sobie takiego mini managera, dodawanie zawodnikow, ich umiejetnosci, ustawienie na boisku − wplywa na wspolczynnik wygranej. (to juz mam za sobą). Mam dwie druzyny walczace miedzy sobą, np. Przypadek 1: Druzyna1 − wspolczynnik 90 Druzyna2 − wspolczynnik 80 Przypadek 2: Druzyna1 − wspolczynnik 90 druzyna2 − wspolczynnik 50 Chcę wymyslec algorytm taki, ktory bedzie te wspolczynniki uwzgledniac i w miare rzeczywisty sposob oddawał wynik spotkania (chodzi o podzial punktow, nie ilość bramek). W przypadku pierwszym blizej jest do remisu, niz w przypadku drugim (roznica jest kolosalna). W drugim przypadku bardzo prawdopodobne jest to, ze przegra druzyna druga (o ilosci wpuszczonych bramek na razie nie mowimy). W przypadku pierwszym − prawie są równe. Teraz rozumiesz?
6 wrz 17:01
asdf: zrobilem cos takiego: http://pastebin.com/Gaz7NGGs
6 wrz 17:04
asdf: jak to odpalilem to w miare normalny sposob oddaje to, jednak o remisie tutaj nie ma mowy − za maly przedzial liczbowy losuje dla remisu (na 100 wypada max 5 liczb), zmniejszenie zakresu naprawi ten problem (ale tez nie zepsuje reszty)?
6 wrz 17:15
Trivial: Najprostsze rozwiązanie problemu to zastosowanie generatora liczb losowych o rozkładzie normalnym. http://pl.wikipedia.org/wiki/Rozk%C5%82ad_normalny http://upload.wikimedia.org/wikipedia/commons/8/8c/Standard_deviation_diagram.svg Wtedy każda drużyna miałaby dwa parametry: 1) średnią μ 2) odchylenie standardowe σ Np. dla μ = 80, σ = 5 kolejne losowania mogą dać wyniki: 81, 85, 77, 82, 86, 79, 73, ... A dla μ = 90, σ = 5: 87, 84, 93, 90, 79, 96, ... Kto wylosował więcej punktów ten wygrywa. Generator liczb losowych o rozkładzie Gaussa jest dostarczony w standardzie C++11: http://en.cppreference.com/w/cpp/numeric/random/normal_distribution
6 wrz 20:30
asdf: Dzięki, przeanalizuję, ale jak na razie nie wie z tego ogarniam
7 wrz 01:11
asdf: ale ile tych losowań powinno się odbyć?
7 wrz 01:13
asdf: rozumiem, ze dla: liczba1 = 90 liczba2 = 80 Wspolczynnik to roznica 10%, ale i tak juz jest pewne, ze wygra liczba1...chyba, ze cos nie rozumiem
7 wrz 01:14
asdf: moglbys jakis konkretny przyklad podac?
7 wrz 12:47
Trivial: Przy danych takich jak podałem wyżej prawdopodobieństwo zwycięstwa drużyny 80 wynosi ok. 7.86%. U mnie, 80 i 90 to nie są "współczynniki wygranej" tylko liczby punktów, które średnio zdobywa drużyna. Równie dobrze współczynnik taki może być równy np. 150. Dla każdej drużyny masz także drugi parametr − odchylenie standardowe. Mówi on o tym, jak bardzo wynik może "odchylić się" od średniej. Przyjmując μ = 150: dla σ→0 zawsze otrzymasz 150. dla σ=5: http://www.wolframalpha.com/input/?i=random+number+with+N%28150%2C+5^2%29 dla σ=10: http://www.wolframalpha.com/input/?i=random+number+with+N%28150%2C+10^2%29
7 wrz 13:01
asdf: Ok, czyli wystarczy zwiekszyc odchylenie, do "wlasnych potrzeb" tak? Jeszcze mam o to pytanie: Kto wylosował więcej punktów ten wygrywa. Na końcu ma być to suma tych punktów, wylosowanych, np. 100 razy (powinno wystarczyc tyle? Poczytalem cos o prawdopodobienstwie, przy duzej ilosci (np 100) wywolan wyniki beda bardzo podobne do tych co maja iteracje, np. 1000 razy)
7 wrz 15:25
asdf: ?
8 wrz 11:58
Trivial: Tzn. nie wiem dlaczego chcesz losować wiele razy. Jeden mecz − dwa losowania (po jednym dla każdej z drużyn). Chyba że czegoś nie rozumiem. emotka Odchylenie możesz sobie ustawić dla każdej drużyny z osobna, albo jakoś sprytnie określać według "własnych potrzeb".
8 wrz 14:07
asdf: Ok, dzieki
8 wrz 19:36