Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Metode de generare a numerelor aleatoare

calculatoare



+ Font mai mare | - Font mai mic



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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2997
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved