Seqüències pseudo-aleatòries P31305


Statement
 

pdf   zip

thehtml

Sigui y   (modm) l’equivalent matemàtic de y%m en C++. Una manera habitual d’aconseguir una seqüència de nombres pseudo-aleatoris consisteix a triar tres naturals a, b i m, i un nombre inicial x0, i calcular cada xi+1 a partir d’xi, fent servir aquesta igualtat:

xi+1 = (a · xi + b)(mod m ) ⁠ ⁠ .

Algunes combinacions produeixen seqüències que poden semblar realment aleatòries. Per exemple, amb a = 10, b = 7, m = 23, i x0 = 4, obtenim 4, 1, 17, 16, 6, 21, 10, 15, …Però amb a = 2, b = 50, m = 100, i x0 = 0 obtenim 0, 50, 50, 50, …

Diverses mesures estadístiques sobre les seqüències generades en permeten estimar com s’assemblen a seqüències realment aleatòries. Feu un programa que en calculi algunes: la mitjana dels nombres obtinguts, la longitud de la subseqüència consecutiva estrictament creixent més llarga, i la longitud de la subseqüència consecutiva estrictament decreixent més llarga.

Entrada

L’entrada consisteix en diversos casos, cadascuna amb cincs naturals a, b, m, x0 i p. Aquest últim és el nombre d’elements de la seqüència que cal generar. Suposeu 2 ≤ m ≤ 30000, que a, b i x0 es troben entre 0 i m − 1, i p ≥ 1.

Sortida

Per a cada cas, escriviu les tres quantitats demanades, la primera amb dos decimals de precisió. Per fer-ho, poseu aquestes dues línies al principi del vostre main:

    cout.setf(ios::fixed);
    cout.precision(2);
Public test cases
  • Input

    10 7 23 4 8
    2 50 100 0 4
    1 0 2 0 1
    

    Output

    11.25 2 3
    37.50 2 1
    0.00 1 1
    
  • Information
    Author
    Salvador Roura
    Language
    Catalan
    Official solutions
    C++
    User solutions
    C++