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

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