Pszeudo random számok rendezése

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.

Lottószámok generálása

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;
}

Random számok a konzolon

Nevek véletlen és ábécé sorrendje

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;
}

Véletlen és ábécé rendezésű nevek