1. Sissejuhatus
Programmeerimises kasutatakse juhuslikke numbreid erinevatel eesmärkidel ning eriti laialdaselt ka C keeles. Juhuslikke numbreid rakendatakse näiteks mängu stsenaariumide loomisel, juhuslikul valimil, andmete segamisel ja paljudes muudes olukordades. Selles artiklis selgitame üksikasjalikult, kuidas C keeles juhuslikke numbreid genereerida, ning toome näiteid nende praktilisest kasutamisest. Süveneme C keele juhuarvude genereerimisse ja laiendame oma oskuste hulka.
2. Mis on juhuarv
Juhuarvude ja pseudojuhuarvude mõiste
Juhuarv viitab ettearvamatule numbrile, mis üldiselt genereeritakse määratud vahemikus juhuslikult. Kuid arvutites genereeritud juhuarvud on tegelikult nn „pseudojuhuarvud“, mis luuakse kindlate reeglite alusel ning seetõttu ei ole need täiesti juhuslikud. Kuna pseudojuhuarvud luuakse algoritmi abil, tekib sama seemneväärtust (algväärtust) kasutades alati sama juhuarvude jada.
3. Juhuarvude genereerimine C keeles
C keele standardteegis on olemas funktsioonid juhuarvude genereerimiseks. Siin käsitleme peamiselt funktsioone rand()
ja RAND_MAX
ning seemneväärtuse seadmiseks kasutatavat funktsiooni srand()
.
rand() funktsiooni põhialused
rand()
on C keele põhifunktsioon juhuarvu genereerimiseks. See tagastab juhusliku täisarvu vahemikus 0 kuni RAND_MAX
. RAND_MAX
on teegis määratletud konstant, mis sõltub süsteemist ja keskkonnast, kuid on tavaliselt 32767.
#include <stdio.h>
#include <stdlib.h>
int main() {
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
Ülaltoodud koodis genereeritakse rand()
abil juhuslik täisarv vahemikus 0 kuni 32767 ja väljastatakse see ekraanile.
Seemneväärtuse seadmine srand() abil
Kuna rand()
genereerib numbreid sama seemneväärtuse põhjal, antakse vaikimisi iga kord sama jada. Selle vältimiseks saab kasutada funktsiooni srand()
, et määrata seemneväärtus ja saada iga käivituse korral erinev juhuarvude jada. Levinud viis on kasutada praegust aega seemneväärtusena.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL)); // Seemne initsialiseerimine praeguse ajaga
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
Selles näites kasutatakse time(NULL)
praeguse aja hankimiseks ja selle määramiseks seemneväärtusena. Nii genereeritakse iga programmi käivitamisel erinevad juhuslikud numbrid.
Juhuarvud kindlas vahemikus
Kindlas vahemikus (nt 1 kuni 10) juhuarvu genereerimiseks saab kasutada järgmist koodi:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int min = 1;
int max = 10;
int random_number = min + rand() % (max - min + 1);
printf("Random number between %d and %d: %d\n", min, max, random_number);
return 0;
}
See kood genereerib juhusliku arvu vahemikus 1 kuni 10. Avaldis rand() % (max - min + 1)
tagab, et saadud arv jääb määratud vahemikku.

4. Juhuarvude kasutamise näited
Järgnevalt mõned praktilised näited juhuarvude kasutamisest.
Täringu simuleerimine
Täringu silmade juhuslik genereerimine võimaldab luua lihtsa simulatsiooni. Täringu väärtused jäävad vahemikku 1 kuni 6.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int dice_roll = 1 + rand() % 6;
printf("Dice roll: %d\n", dice_roll);
return 0;
}
See programm väljastab juhusliku arvu vahemikus 1 kuni 6, nagu täringuveeretuse tulemus.
Massiivi segamine
Massiivi elementide juhuslik ümberjärjestamine võimaldab saada segatud järjestuse. Siin vahetatakse elemente juhuslikult omavahel.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *array, int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int main() {
srand((unsigned int) time(NULL));
int array[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(array) / sizeof(array[0]);
shuffle(array, size);
printf("Shuffled array: ");
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
See kood segab massiivi elementide järjekorra juhuslikult.
Mänguarenduses kasutamine
Mänguarenduses kasutatakse juhuarve näiteks vastaste ilmumise koha või esemete genereerimiseks. Juhuslikkus lisab mängule ettearvamatuid elemente ja muudab mängukogemuse realistlikumaks.
5. Tähelepanekud juhuarvude genereerimisel
rand() funktsiooni piirangud
rand()
sobib lihtsateks juhuarvude genereerimisteks, kuid kuna see on pseudojuhuarv, on sellel teatud perioodilisus. Suure hulga numbrite genereerimisel võib tekkida korduvaid mustreid, mistõttu see ei sobi olukordadesse, kus on vaja täiesti juhuslikke väärtusi.
Mitmelõimelises keskkonnas tekkivad probleemid
Kui mitmelõimelises keskkonnas kasutatakse rand()
funktsiooni, võivad mitmed lõimed kasutada sama seemneväärtust, mis võib põhjustada identseid tulemusi eri lõimedes. Seetõttu tuleks igale lõimele määrata erinev seeme.
Kvaliteetsemate generaatorite kasutamine
C++ ja teistes keeltes on saadaval kõrgema kvaliteediga juhuarvugeneraatorid. Kuigi C keeles on valik piiratud, on soovitatav kasutada näiteks random()
funktsiooni või Mersenne Twisterit (mt19937
), mis pakuvad paremat juhuslikkust.
6. Kokkuvõte
Selles artiklis käsitlesime C keeles juhuarvude genereerimist, tutvustasime koodinäiteid ja praktilisi kasutusviise. rand()
funktsioon on lihtsates programmides väga kasulik, kuid olukordades, kus on vaja täiesti juhuslikke väärtusi, tuleb olla ettevaatlik.