Pszeudo random számok
Amikor véletlenszerűen szeretnénk számokat generálni, akkor a pszeudo random szám generálás megoldásaira támaszkodhatunk. Habár meglehetősen sokrétű a random generálás felhasználási köre, itt a lottószám húzás és nevek véletlenszerű sorrendbe állítása lesz a szemléltetés tárgya.
Az alábbi program lottószámok húzását szimulálja. A program először a random szám generálást végzi el, 2 alkalommal 7db számot választ ki az 1-35 intervallumból, melyek paraméterei definiáltak. A generálás után előfordulhatnak számismétlések, ezért ezeket törölni kell. A program végén buborék rendezéssel emelkedő sorrendbe állítjuk a generált számokat tartalmazó tömbelemeket és kiíratjuk a konzolra.
#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <windows.h>
#include <stdbool.h>
#define UPPER 35
#define LOWER 1
#define INTV (UPPER - LOWER + 1) + LOWER //ebben az intervallumban //+1 = benne van az upper is! (interval)
#define LOTTO 7
#define N 2
int main() {
setlocale(LC_ALL, "Hungarian_Hungary.1250");
//Random
time_t t;
srand((unsigned)time(&t));
int i, j, k, r, temp = 0;
printf("Random sorok ismétlésekkel\n");
for (j = 0; j < N; j++) {
printf("%d. sor: ", j + 1);
for (i = 0; i < LOTTO; i++) {
r = rand() % INTV;
printf("%d ", r);
}
printf("\n");
}
//ne legyen ismétlődés... avoid repetition
bool arr[INTV] = {0};
int szamok[N][LOTTO];
printf("\nRandom sorok ismétlések nélkül\n");
for (j = 0; j < N; j++) {
printf("%d. sor: ", j+1);
for (i = 0; i < LOTTO; i++) {
r = rand() % INTV;
if (!arr[r]) {
szamok[j][i] = r;
printf("%d ", r);
}
else
i--;
arr[r] = 1;
}
memset(arr, 0, sizeof(arr));
printf("\n");
}
//emelkedő sorrendbe... ascending order
printf("Emelkedő sorrendben:\n");
for (k=0;k<N;k++) {
for (i=0;i<LOTTO;i++) {
for (j = i + 1; j<LOTTO;j++) {
if (szamok[k][i] > szamok[k][j]) {
temp = szamok[k][i];
szamok[k][i] = szamok[k][j];
szamok[k][j] = temp;
}
}
}
}
//kiíratás... print
for (i = 0; i < N; i++) {
printf("%d. sor: ", i + 1);
for (j = 0; j < LOTTO; j++)
printf("%d ", szamok[i][j]);
printf("\n");
}
return 0;
}

A következő program hasonlóan az előzőhöz szintén random számokat generál, ám az így kapott számok karakterláncok indexeiként fognak szerepelni. A random sorrendbe állításuk tehát a generált tömbindexek szerint, rendezésük pedig ábécé sorrendben történik a buborék rendezés algoritmusának felhasználásával. A program elsőként a nevek véletlen sorrendjét, majd az ábécé sorrendjét íratja ki a konzolra. A neveknek rendezés előtt dinamikusan kell memóriát foglalni, ebben az esetben egy definiált (#define MAX 10) méretben (lásd.: realloc). A számgenerálás az előző példaprogramtól eltérően az alábbi kódban ismétlődések nélkül valósul meg.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#include <windows.h>
#include <stdbool.h>
#define ELEM 5
#define MAX 10 //leghosszabb előforduló név
int main() {
setlocale(LC_ALL, "Hungarian_Hungary.1250");
// Adatok kiiíratása random sorrendben
char *nevek[] = { "Béla","Mária","Józsi","Anna","Baltazár" };
int i, r;
srand(time(NULL));
int arr[ELEM] = { 0 };
//random sorrend... random order
printf("Véletlen sorrendben: ");
for (i = 0; i < ELEM; i++) {
r = rand() % ELEM;
if (!arr[r])
printf("%s ", nevek[r]);
else
i--;
arr[r] = 1;
}
memset(arr, 0, sizeof(arr));
//memória foglalás... allocate memory
char **nevsor = malloc(sizeof(char*)*ELEM);
for (i = 0; i < ELEM; i++) {
nevsor[i] = malloc(MAX); //másoláskor változóak a méretek, 2.megoldás: realloc() a rendező függvényben!
strcpy(nevsor[i], nevek[i]);
}
//rendezés ábécé sorrendbe... to alphabetical order
int j, k;
char *temp;
for (j = 0; j < ELEM; j++) {
for (k = j + 1; k < ELEM; k++) {
if (strcmp(nevsor[j], nevsor[k]) > 0) { //magyar ábécére nem jó!
temp = malloc(strlen(nevsor[j])+1);
strcpy(temp, nevsor[j]);
strcpy(nevsor[j], nevsor[k]);
strcpy(nevsor[k], temp);
free(temp);
}
}
}
//kiíratás ábécé sorrendben... print
printf("\nÁbécé sorrendben: ");
for (i = 0; i < ELEM; i++)
printf("%s ", nevsor[i]);
//memória felszabadítás... free memory
for (i = 0; i < ELEM; i++)
free(nevsor[i]);
free(nevsor);
return 0;
}
