Arrays - Lottozahlen simulieren



  • hey,
    ich bin gerade dabei mich in arrays einzuarbeiten, bin aber zur zeit noch ganz ganz am anfang. dabei bin ich auf folgendes programm gestoßen, das eigentlich recht einfach ist.
    Man gibt die anzahl der kugeln n, die zur verfügung stehen sollen ein und die anzahl derjenigen kugeln x, die nach dem zufallsprinzip gezogen werden sollen z.b. 6 aus 49.

    hier das gesamte programm dazu

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define MAX_KUGEL 100

    int lotto_zahl[MAX_KUGEL+1];

    int main(void)
    {
    int n, x, z=0, i;

    srand(time(NULL));

    do {
    printf("Wieviele Kugeln sollen zur Verfuegung stehen (mind. 1 und max %d): ",
    MAX_KUGEL);
    scanf("%d", &n);
    }while (n<1 || n>MAX_KUGEL);

    do {
    printf("Wieviele werden davon gezogen (mind. 1 und max. %d): ", n);
    scanf("%d", &x);
    } while (x<1 || x>n);

    while (++z<=x)
    do { } while (lotto_zahl[rand()%n]++);

    printf("\n\n\n==== %d aus %d ====\n", x, n);
    for (i=1 ; i<=n ; i++)
    if (lotto_zahl[i])
    printf("%6d", i);
    printf("\n\n");
    return(0);
    }

    meine frage dazu :

    was macht diese anweisung
    while (++z<=x)
    do { } while (lotto_zahl[rand()%n]++); ??

    warum gibt es keine do anweisung {}?
    und warum wird lotto_zahl[rand()%n]++ am ende inkrementiert ??
    warum genau macht man %n und keine andere zahl ?

    vielen dank für alle antworten!

    gruß array09



  • warum genau macht man %n und keine andere zahl ?

    Siehe
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-172876.html

    warum gibt es keine do anweisung {}?

    Weil alles notwendige in der Abbruchbedingung gemacht wird. Statt {} sollte man auch ; schreiben können (leere Anweisung statt leerer Block).

    Das passiert öfter mal, zB hier auch:

    int laenge_eines_strings(char *s)
    {
        int i = 0;
        while (s[i++])
            ;
        return i - 1;
    }
    

    und warum wird lotto_zahl[rand()%n]++ am ende inkrementiert ??

    Ich schätze mal, dass in dem Array für jede Zahl gespeichert wird, wie oft sie gezogen wurde. Genauer werde ich darüber nachdenken, wenn du den Code für mich formatierst.



  • array09 schrieb:

    meine frage dazu :

    was macht diese anweisung
    while (++z<=x)
    do { } while (lotto_zahl[rand()%n]++); ??

    warum gibt es keine do anweisung {}?
    und warum wird lotto_zahl[rand()%n]++ am ende inkrementiert ??
    warum genau macht man %n und keine andere zahl ?

    vielen dank für alle antworten!

    gruß array09

    Die Anweisung wählt "zufällig" ein Array-Element aus und inkrementiert dessen Wert. Das ist aber totaler Unsinn, denn

    Ich weiß nicht, woher du diesen Code hast, aber lass die Finger von dieser Quelle. Nicht mal die letzte Schleife ist korrekt, da sie erst bei 1 anfängt.

    Gez. monstermunchkin

    EDIT 1: Doch nicht so ein Unsinn; Hab's mir nochmal angesehen. Es spielt ja keine Rolle, ob ein Element mehrmals inkrementiert wird. Es werden so oder so n Elemente gezogen. Die Schleife am Ende stimmt aber trotzdem nicht 🤡



  • monstermunchkin schrieb:

    [*] Zufallszahlen mittels Modulo sind nicht zufällig.

    Das ist halb so wild.


Anmelden zum Antworten