Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov:  9/13 = 69%

  • Úspešnosť riešenia:   2,22/5  = 44%

Podľa zadania úlohy musíme nájsť spôsob, ako vygenerovať tri náhodné hodnoty teplôt tak, aby priemerná denná teplota z nich vypočítaná bola taká, ako vopred zadaná hodnota. Navyše sa žiadna z týchto teplôt nemôže od priemernej dennej teploty líšiť o viac ako 5 ºC a každú z týchto hodnôt generujeme s presnosťou na dve desatinné miesta. Pripomeňme si ešte vzorec pre výpočet priemernej dennej teploty (pdt):

pdt = (t7 + t14 + 2 * t21) / 4

V tejto rovnici zatiaľ poznáme len hodnotu priemernej dennej teploty. Ostatné tri premenné (t7, t14, t21) sú zatiaľ neznáme. Otázka znie, ako vygenerovať tieto tri hodnoty?

Ak vygenerujeme hodnotu pre t7, naša rovnica bude mať už len dve neznáme (t14, t21). Ak vygenerujeme aj hodnotu pre t14, zníži sa počet neznámych na jednu (t21). Dostaneme tak jednu rovnicu a v nej jednu neznámu. Toto už vieme vyriešiť.

t21 = (pdt * 4 - t7 - t14) / 2

Teraz vám určite napadne otázka. Čo ak sa hodnota t21 bude od priemernej dennej teploty líšiť o viac ako 5 ºC?

Pozrime sa ešte raz na vzorec pre priemernú dennú teplotu. Každú z teplôt t7 a t14 započítavame raz. Teplotu t21 započítavame 2 krát. V uvedenom vzorci majú teda teploty t7 a t14 spolu rovnakú váhu ako teplota  t21. Takže, ak by sme obidve hodnoty zvolili tak, že budú od priemernej dennej teploty nižšie (resp. vyššie) o 5 ºC tak vypočítaná hodnota t21 bude od priemernej dennej teploty naopak vyššia (resp. nižšia) o 5 ºC. V každom prípade to však bude vhodná hodnota ktorá sa od priemernej dennej teploty nelíši o viac ako 5 ºC.

Ak by sme sa rozhodli generovať teploty v inom poradí (napr. najskôr t21), tak vygenerovať vhodné zvyšné dve hodnoty by už nebolo také jednoduché.

Ak už vieme ako úlohu vyriešiť, pozrime sa na to, ako to zapísať v programovacom jazyku.

Najskôr potrebujeme vygenerovať náhodné číslo z intervalu:

<pdt - 5, pdt + 5>

Väčšina programovacích jazykov umožňuje generovať pseudonáhodné čísla(1).

Imagine Logo

Príkaz nahodne cislo vráti pseudonáhodné celé číslo z intervalu <0, cislo - 1>.

My potrebujeme generovať číslo z intervalu: <pdt - 5, pdt + 5>

To je to isté, ako: pdt + náhodné číslo z intervalu <-5, +5>

To je ale to isté, ako: pdt - 5 + náhodné číslo z intervalu <0, 10>

Výsledkom je celé číslo. Podľa zadania však potrebujeme číslo s aspoň dvoma desatinnými miestami. Generovanie upravíme tak, že vygenerujeme 100 krát väčšie číslo ktoré potom predelíme číslom 100. Získame tak dve desatinné miesta.

pdt - 5 + náhodné číslo z intervalu <0, 1000> / 100

Uvedomme si, že príkaz  nahodne cislo vráti číslo z intervalu  <0, cislo - 1>. My však potrebujeme aj hodnotu cislo. Zvýšime preto hornú hodnotu inervalu na 1001.

Výsledný kód môže vyzerať nasledovne: 

;Imagine logo
viem generujTeploty :pdt
  urobTu "t7 :pdt - 5 + (nahodne 1001) / 100
  urobTu "t14 :pdt - 5 + (nahodne 1001) / 100
  urobTu "t21 (:pdt * 4 - :t7 - :t14) / 2
  vysledok (zoznam :t7 :t14 :t21)
koniec

Python

Príkaz random.randint(a, b) z modulu random vráti pseudonáhodné celé číslo z intervalu <a, b>.

My potrebujeme generovať číslo z intervalu: <pdt - 5, pdt + 5>

To je to isté, ako: pdt + náhodné číslo z intervalu <-5, +5>

Výsledkom je celé číslo. Podľa zadania však potrebujeme číslo s aspoň dvoma desatinnými miestami. Generovanie upravíme tak, že vygenerujeme 100 krát väčšie číslo ktoré potom predelíme číslom 100. Získame tak dve desatinné miesta.

pdt + náhodné číslo z intervalu <-500, 500> / 100

Výsledný kód môže vyzerať nasledovne:

#Python
def
generujTeploty(pdt):
    '''
    :param pdt: priemerna denna teplota
    :type pdt: float
    :return: trojica teplot pocas dna,
             priemerna denna teplota z nich vypocitana je pdt
    :rtype: tuple
    '''

    import random
    t7 = pdt + random.randint(-500, 500) / 100
    t14 = pdt + random.randint(-500, 500) / 100
    t21 = (pdt * 4 - t7 - t14) / 2
    return t7, t14, t21

(1) Pseudonáhodné čísla sú čísla, ktoré vyzerajú ako náhodné. V skutočnosti sú však vypočítané pomocou šikovne navrhnutej funkcie.

Vaše zaujímavé riešenia a najčastejšie chyby

Najčastejšou chybou bolo to, že ste si neuvedomili, že generátory náhodných čísiel neumožnia vygenerovať poslednú hodnotu - pravý okraj intervalu. Rovnako ste niektorí mali problém aj s dvoma desatinnými miestami. Úlohu vyriešil správne len jeden tím, "expert aa". Gratulujeme.