ims Flashcards

1
Q

Uvažujme funkciu F(x). Napíšte pseudokód programu, ktorý vypočíta odhad plochy pod krivkou
funkcie F(x) na intervale <20, 100>. Je možné použiť funkcie pre generovanie pseudonáhodných
čísel. (10 bodov)

A

double plocha() {
int pocet_pokusov = 10000; // Err = 1/sqrt(N) => chyba 1%
double sum = 0.0;
double x;
// nepozname ohranicenost funkcie = “nevieme y rozmer stvorca do ktoreho strielat” => preto ratame priemernu y hodnotu
for (int i = 0; i < pocet_pokusov; i++) {
// vzorec pre interval => (b - a) + a
x = Random() * (100 - 20) + 20; // teoreticky mozno pouzit aj x = Uniform(20, 100)
sum += F(x);
}
double priemer = sum / pocet_pokusov;
return priemer * (100 - 20);
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Majme kružnicu o polomere r=20. Napíšte pseudokód funkcie, ktorá vypočíta obsah zadaného
kruhu metódou Monte Carlo tak, aby chyba metody dosahovala 5 % (zdôvodnite nastavenie
presnosti metódy). (10 bodov)

A

double obsah_kruznice(r) {
// Err = 1/sqrt(N) => 5 % = 0.05 = 1/20 = 1/sqrt(400)
int pocet_pokusov = 400; // N
count = 0;
for(int i = 0; i < pocet_pokusov; i++){
y = Random(); // pracujeme akokeby na stvorci opisanom stvrtine jednotkovej kruznice
x = Random(); // generujeme hodnoty od 0 do 1
if(sqrt(xx + yy) < 1)
count++;
}
pravdepodobnost = count / pocet_pokusov;
// funkciou ale vieme aproximovat len stvrt kruznicu, preto vysledok musime vynasobit este 4
return (pravdepodobnost * r * r) * 4; // tu ale polomer musi byt
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Majme guľu o polomere r=20. Napíšte pseudokód funkcie, ktorá vypočíta objem zadanej gule
metódou Monte Carlo tak, aby chyba metody dosahovala 5 % (zdôvodnite nastavenie presnosti
metódy). (10 bodov)

A

double objem_gule(r) { // r = 20
// Err = 1/sqrt(N) => nasa chyba ma byt 0.05 => 1/20 => 1/sqrt(400) => treba 400 pokusov
int pocet_pokusov = 400;
count = 0;
for(int i = 0; i < pocet_pokusov; i++){
y = Random();
x = Random();
z = Random();
if(sqrt( xx + yy + z*z) < 1)
count++;
}
pravdepodobnost = count / pocet_pokusov;
return (pravdepodobnost * r * r * r) * 8;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Majme spojitú náhodnú veličinu na intervale <0,1> danú funkciou hustoty pravdepodobnosti
f(x), ktorá má rozsah funkčných hodnôt <0, 5). Napíšte pseudokód generátora tejto náhodnej
premennej s použitím vylučovacej metódy a funkcie rnd() generujúcej rovnomerné rozloženie na
intervale <0, 1> . (10 bodov)

A

double generator() {
double x, y;
do {
x = rnd(); // generate a random value from <0, 1>
y = rnd() * 5; // generate a random value and move it to range <0, 5>
} while (y > f(x)); // check if the value is under the curve of f(x) => if y lies under f(x)
return x;
}
// pepe povedal ze nemame riesit <0, 1> vs. <0, 1) v tychto prikladoch

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Bola zadana funkcia unsigned RND(), ktorá generuje pseudo nahod č. Napísať pseudokód, ako
zistiť dĺžku periódy kongruentného generátora tejto funkcie. (10 bodov)

A

// generator po istom pocte iteracii (kedze je kongruentny) znovu zacne generovat rovnaku postupnost hodnot
unsigned ran = RND();
unsigned counter = 1;
while (RND() != ran) // tento moment odchytime a pocet iteracii, kde sa hodnoty neopakuju mozno brat ako periodu
counter++;
printf(“Dlzka periody je %d\n”, counter);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Předpokládejte kongruentní generátor unsigned int RND(); Napíšte pseudokód programu, který
transformuje výstup generátoru na rovnoměrné rozložení Uniform(2, 10). (10 bodov)

A

unsigned int x = RND();
vysledek = (x / ((double) UINT_MAX + 1)) * (10 - 2) + 2;
// Uniform je <2, 10). Cize potrebujeme generovat cisla <0,1), nie <0,1>.
// Preto je za UINT_MAX to + 1… aby sa tym vylucila horna medza z daneho intervalu
// Uniform v SIMLIBE: http://www.fit.vutbr.cz/~peringer/SIMLIB/doc/html/random2_8cc_source.html#l00071
// otazky k tomuto: discord -> ReBeL#1337

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Je daná hustota pravdepodobnosti x/2 na intervale <0,2>. Určte inverznú distribučnú funkciu.
Napíšte kód, ktorý generuje náhodné čísla s použitím tejto inverznej funkcie. Máte k
dispozícii funkciu double random(), ktorá generuje čísla v intervale <0,1>.

A

double generate() {
return 2 * sqrt(random());
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Majme spojitú náhodnú veličinu na intervale <0,1> s lineárnou funkciou hustoty
pravdepodobnosti, tj. vo forme f(x) = a.x. Vypočítajte konštantu a, nakreslite graf funkcie
f(x) s popisom oboch osí a napíšte pseudokód generátora tejto náhodnej premennej. Použite
metódu inverznej transformácie. (10 bodov)

A

double generate() {
return sqrt(random());
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly