CATEGORII DOCUMENTE |
Metode de generare a numerelor aleatoare
Pentru a reproduce in mod realist anumite elemente ale sistemului simulat/pentru rezolvarea unor probleme numerice apare necesitatea unor numere "Alese la intamplare(aleatoare)".
Despre un numar oarecare se poate spune ca este "intamplator" numai daca se afla intr-un context statistic.
Prin definitie numerele aleatoare satisfac urmatoarele cerinte:
-sunt repartizate uniform intr-un interval [0,1];
-sunt statistic independente
-sunt reproductibile;
-functia de repartitie este stabila;
-sirul enumerate are o perioada de repetitie mare;
Principalele clase de generare a numerelor aleatoare sunt:manuale ,fizice,de memorizare care constau in consultarea specialistilor,analitice.
In mod practic nu se pot genera numere aleatoare care sa satisfaca riguros cerintele mentionare anterior.De aceea numerele furnizate de generatoare analitice se numesc numere pseudo-aleatoare.
Exista mai multe metode de generare a numerelor pseudo-aleatoare prin care se numara:
1-crearea de numere aflate in intervalul [0;32,767],numarul 32,767 reprezentand maximul permis de sistem;
2-crearea de numere care se afla intre 1 si o valoare maxina declarata de utilizator
3-crearea de numere cu lungime fixa intre 1 si o valoare maxima declarata de utilizator,valoare ce poate avea 0-uri adaugate in fata,in caz de nevoie.
Fiecare metoda este valida pentru un filename extention,dar pot exista mai multe utilizari care necesita fie o categorie de numere,fie un numar fix de cifre cu zerouri in fata In orice caz conceptul de baza este acelasi.
Se incepe prin initializarea variabilei RANDOM la actualul PID: RANDOM=&&;&&=PID-ul procesului curent din sistem;PID-UL variaza si de aceea este bine sa initializam variabila RANDOM.Dupa ce aceasta variabila a fost initializata o putem folosi ca pe oricare alta variabila,apoi vom folosi comanda echo pentru a afisa urmatorul numar pseudo-aleator.De exemplu:
#!/bin/sh
RANDOM=$$
echo $RANDOM
Afiseaza 27054
#!/bin/sh
RANDOM=$$
echo $RANDOM
Afiseaza 22320
#!/bin/sh
RANDOM=$$
echo $RANDOM
Afiseaza 9424
#!/bin/sh
RANDOM=$$
echo $RANDOM $RANDOM
Afiseaza 11186
In mod implicit variabilele vor produce numere intre 0 si 32 767.Daca avem nevoie,putem produce mai multe numere in acelasi timp adaugand &RANDOM la fiecare intrare in comanda echo.
Metoda 1-Creare de numere intre 0 si 32,767
Crearea de numere pseudo-aleatoare folosind aceasta metoda implicita este cea mai simpla cale de a folosi variabila de mediu RANDOM.Singurul lucru care trebuie facut este sa initializam variabila de mediu RANDOM cu valoare initiala seed si sa folosim comanda echo pentru a afisa numerele noi ce vor varia intre 0 si 32767.Nu exista control asupra numarului de cifre daca acesta depaseste 5 si nu se poate poate specifica valoarea maxima pentru numar.
Functia get_random_number este prezentata pe un rand deoarece se presupune ca variabila de mediu RANDOM a fost initializata in corpul principal a shell scriptului.
Functia get_random_number
#!/bin/sh
SCRIPT_NAME=`basename $0`
RANDOM=$$
echo $RANDOM
get_random_number
echo "$RANDOM"
Metoda 2-Creare de numere intre 1 si maximul definit de utilizator
Deseori vrem sa limitam variatia numerelor pentru a nu depasi maximul definit de utilizator.Un exemplu ar fi sa cream numere de loterie intre 0 si un maxim care ar putea fi 36.Vom folosi apoi operatorul arithmetic modulo pentru a incadra toate numerele intr-un set fix de numere cu valori intre [0,N-1] ce se numeste modulo N aritmetic.Pentru variatia numarului avem nevoie de o valoare maxima furnizata de utilizator pe care o vom atribui unei variabile numite UPPER_LIMIT.Operatorul modulo este semnul de procente"%"si are aceeasi semnificatie ca cea a semnului de diviziune "/".De asemenea vom folosi variabila de mediu RANDOM pentru a obtine numarul pseudo-aleator.De data aceasta vom folosi urmatoarea ecuatie pentru a limita numarul astfel incat sa nu depaseasca maximul modulo N aritmetic definit de utilizator:
RANDOM_NUMBER=$(($RANDOM % $UPPER_LIMIT + 1))
Folosind procentul "%" vom obtine un numar pseudo-aleator cuprins intre 1 si $UPPER_LIMIT definite de utilizator.Functia care foloseste aceasta ecuatie este in_range_random_number.
Function in_range_random_number
Aceasta functie presupune ca variabila RANDOM a fost initializata in corpul principal al shell scriptului si ca variabila UPPER_LIMIT definita de utilizator a fost stabilita.Functia va produce numere intre 1 si valoarea maxima declarata de utilizator,dar numarul de cifre va varia in functie de cum numerele sunt produse.
#!/bin/sh
SCRIPT_NAME=`basename $0`
RANDOM=$$
echo $RANDOM
echo "UPPER_LIMIT="
read UPPER_LIMIT
in_range_random_number
Metoda 3-Crearea de numere cu lungime fixa intre 1 si o valoare maxima declarata de utilizator
In ambele din metodele anterioare nu avem cum sa aflam cate cifre are noul numar.Acum insa,putem produce numere cu o lungime fixa adaugand zerouri in fata numarului pentru fiecare cifra ce lipseste.De exemplu vrem ca toate numerele sa contina 4 cifre si presupunem ca numarul produs este 24.Pentru ca dorim ca numarul produs sa aibe 4 cifre vom pune in fata lui 2 zerouri obtinand astfel 0024. Pentru a completa numarul trebuie sa stim lungimea sirului de caractere care formeaza numarul.
In shellul KORN variabila se afla intre acolade precedate de "#": RN_LENGTH=$(echo $)
Daca variabila RANDOM_NUMBER are 24 atribuit ca o valoare atribuita,atunci rezultatul comenzii anterioare este 2(variabila RN_NUMBER points to the value 2),indicand 2 cifre.De asemenea vom avea nevoie si de lungimea valorii UPPER_LIMIT si vom folosi diferenta pentru a afla cu cate zerouri trebuie completat numarul pseudo-aleator obtinut.
function in_range_fixed_length_random_number
#Creaza un numar pseudo-aleator mai mic sau egal decat
#valoarea$UPPER_LIMIT care este definita de utilizator
# aceasta functie va completa rezultatul cu
# zerouri pentru a mentine acelasi numar de cifre
RANDOM_NUMBER=$(($RANDOM % $UPPER_LIMIT + 1))
# gaseste lungimea fiecarui sir de caractere
RN_LENGTH=$(echo $)
UL_LENGTH=$(echo $)
# calculeaza diferenta in lungimea sirului de caractere
(( LENGTH_DIFF = UL_LENGTH - RN_LENGTH ))
# completeaza valoarea $RANDOM_NUMBER cu zerouri in fata ei.
#pentru a mentine acelasi numar de cifre
case $LENGTH_DIFF in
0) echo "$RANDOM_NUMBER"
1) echo "0$RANDOM_NUMBER"
2) echo "00$RANDOM_NUMBER"
3) echo "000$RANDOM_NUMBER"
4) echo "0000$RANDOM_NUMBER"
5) echo "00000$RANDOM_NUMBER"
*) echo "$RANDOM_NUMBER"
esac
La scriptul anterior folosim aceeasi modalitate ca la functia in_range_random_number pentru a stabili limita superioara atunci cand vrem sa cream numerele,dar facem adaugari in cod pentru a afla lungimea sirului de caractere ale valorilor UPPER_LIMIT RANDOM_NUMBER.Stiind valoarea ambelor siruri de caractere scadem valoarea numarului aleator din lungimea limitei superioare si folosim diferenta intr-o declaratie de caz pentru a adauga numarul corect de zerouri la numarul obtinut.
Pentru ca aceasta este o functie trebuie sa presupunem ca UPPER_LIMIT si variabila de mediu RANDOM sunt definite in corpul principal al shell scriptului.Rezultatul final este un numar pseudo-aleator cu lungime fixa si completat cu zerouri in fata lui daca lungimea primului numar rezultat este mai mica decat lungimea limitei superioare.Pentru un UPPER_LIMIT ce are valoarea 9999 se obtine:
#!/bin/sh
SCRIPT_NAME=`basename $0`
RANDOM=$$
echo $RANDOM
echo "UPPER_LIMIT=9999"
read UPPER_LIMIT
in_range_fixed_length_random_number
RANDOM_NUMBER=$(($RANDOM % $UPPER_LIMIT + 1))
RN_LENGTH=$(echo $)
UL_LENGTH=$(echo $)
(( LENGTH_DIFF = UL_LENGTH - RN_LENGTH ))
case $LENGTH_DIFF in
0) echo "$RANDOM_NUMBER"
1) echo "0$RANDOM_NUMBER"
2) echo "00$RANDOM_NUMBER"
3) echo "000$RANDOM_NUMBER"
4) echo "0000$RANDOM_NUMBER"
5) echo "00000$RANDOM_NUMBER"
*) echo "$RANDOM_NUMBER"
esac
#!/bin/sh
SCRIPT_NAME=`basename $0`
RANDOM=$$
case $# in
0) get_random_number
1) UPPER_LIMIT="$1"
case $UPPER_LIMIT in
*) echo "nERROR: $UPPER_LIMIT is not a number"
usage
exit 1
esac
in_range_random_number
if [[ $1 = '-f' ]] || [[ $1 = '-F' ]]
then
UPPER_LIMIT="$2"
case $UPPER_LIMIT in
+([0-9]) : # Do NothingIt's a number
*) echo "nERROR: $UPPER_LIMIT is not a number"
usage
exit 1
esac
in_range_fixed_length_random_number_typeset
else
echo "nInvalid argument $1, see usage below"
usage
exit 1
fi
*) usage
exit 1
esac
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2968
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved