Zufallszahlen Problem

ibafluss

Erfahrenes Mitglied
Hi Leute!

Ich habe ein Problem mit der Erstellung von Zufallszahlen zwischen zwei Zahlenwerten. Und ja ich habe schon die Suchfunktion benützt und bin auf einige Ergebnisse gekommen, aber es hat nichts geklappt. Ich will eine Zahl zwischen 30 und 150 und es wird immer eine Zahl im Bereich von einer Million zurückgegeben :( . Ich hoffe mir kann jemand helfen hier ist der Quellcode:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define hoechste_zielzahl 150
#define niedrigste_zielzahl 30

unsigned int zz (unsigned int max)
{
unsigned int ergebnis = 0;

srand(time(0));
ergebnis = (rand() % ((max + 1) - 1)) + 1;

return ergebnis;
}

unsigned int zzm (unsigned int niedrigste_eingabe, unsigned int hoechste_eingabe)
{
unsigned int max = 0;

srand(time(0));
max = (rand() % ((hoechste_eingabe + 1) - niedrigste_eingabe)) + niedrigste_eingabe;

return max;
}

unsigned int zzz ()
{
unsigned int ziel = 0;

srand(time(0));
ziel = (rand() % ((hoechste_zielzahl + 1) - niedrigste_zielzahl)) + niedrigste_zielzahl;

return ziel;
}

unsigned int Computerzug (unsigned int max, unsigned int ziel, unsigned int Derzeit_zahl)
{
unsigned int ergebnis_zz, hoechste_eingabe, zw_ergebnis;

if ((max - ziel - Derzeit_zahl) < max)
{
return (max - Derzeit_zahl);
}
else for (zw_ergebnis = ziel; zw_ergebnis >= 0; zw_ergebnis = (ziel - (max + 1)))

if ((ziel - zw_ergebnis) == 0)
{
return zz (max); /* Eine Zufallszahl, die kleiner oder gleich max sein muss! */
}

else return zw_ergebnis;
}

int main()
{
unsigned int max = 0, ziel = 0, spieler_zug = 0, derzeit_zahl = 0, zugergebnis = 0, niedrigste_eingabe = 0, hoechste_eingabe = 0;

ziel = (unsigned int) zzz;
niedrigste_eingabe = ziel/10;
hoechste_eingabe = ziel/4;
max = zzm (niedrigste_eingabe, hoechste_eingabe);

printf ("%43s\n\n\n", "Arithmo");
printf ("%-45s%2u", " Hoechste Zahl, die man eingeben darf: ", max);
printf ("%25s%3u", "Zielzahl: ", ziel);
printf ("\n\n");

while (zugergebnis != ziel)
{
printf ("Bitte geben Sie eine Zahl von 1 bis %d ein: ", max);
scanf ("%d", spieler_zug);

if (spieler_zug > max || spieler_zug < 1)
continue;
}
return EXIT_SUCCESS;
}


Die ersten 3 Funktionen sollen Zufallszahlen zurückliefern. Der Code ist natürlich noch nicht fertig und das Wesentliche ist: In der Funktion zzz wird die Zufallszahl nicht richtig erstellt.
 
Hallo ibafluss :)

zu aller erst einmal, könntest du den Code nächstes mal mit
Code:
Dein Code
angeben? Hilft den Code besser zu lesen ;)

ohne deinen Code jetzt richtig gelesen zu haben kann man Zufallszahlen so erzeugen:
Code:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void) {
    srand(time(NULL));
    printf("%d",rand()%100);
}
Hier wurde halt einen Zufallszahl zwischen 1 und 100 erzeugt.
 
Hi

Kleine Korrektur: Von 0 bis einschließlich 99.

Für 30 bis 150 wäre das entsprechend
rand()%121 +30

@Yax: Um zu verhindern, dass beim Erklären der Codetags die Codebox kommt (und man keine Ahnung hat, was man dazu eingeben muss), kannst du rund um die cpp-Tags noparse-Tags machen.

Gruß
 
Erstmal danke für die Antworten ;)

Also ich habe beides probiert aber es klappt immer noch nicht. Hier ist mein Code mit der Lösung von deepthroat (den Code habe ich jetzt auf das Wichtige beschränkt) :

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define hoechste_zielzahl 150
#define niedrigste_zielzahl 30

unsigned int zz (unsigned int max)
{
    unsigned int ergebnis = 0;

    ergebnis = 1 + (unsigned int) (max * rand()/(RAND_MAX + 1)); 

    return ergebnis;
}

unsigned int zzm (unsigned int niedrigste_eingabe, unsigned int hoechste_eingabe)
{
    unsigned int max = 0, zufallshilfe = 0;

    zufallshilfe = hoechste_eingabe - niedrigste_eingabe + 1;
    max = niedrigste_eingabe + (unsigned int) (zufallshilfe * rand()/(RAND_MAX + 1));

    return max;
}

unsigned int zzz ()
{
    unsigned int ziel = 0, zufallshilfe = 0;

    zufallshilfe = hoechste_zielzahl - niedrigste_zielzahl + 1;
    ziel = niedrigste_zielzahl + (unsigned int) (zufallshilfe * rand()/(RAND_MAX + 1));

    return ziel;
}



int main()
{
    unsigned int max = 0, ziel = 0, spieler_zug = 0, derzeit_zahl = 0, zugergebnis = 0, niedrigste_eingabe = 0, hoechste_eingabe = 0;

    ziel = (unsigned int) zzz;
    niedrigste_eingabe = ziel/10;
    hoechste_eingabe = ziel/4;
    max = zzm (niedrigste_eingabe, hoechste_eingabe);

    printf ("%43s\n\n\n", "Arithmo");
    printf ("%-45s%2u", "     Hoechste Zahl, die man eingeben darf: ", max);
    printf ("%25s%3u", "Zielzahl: ", ziel);
    printf ("\n\n");
 
Lass mich raten: Das Ergebnis von zzz in ziel drin ist immer die gleiche Zahl?
C++:
ziel = (unsigned int) zzz;
Fällt dir was auf?

Du rufst zzz gar nicht auf, sondern verwendest die Speicheradresse davon.
So wäre das sinnvoller:
C++:
ziel = (unsigned int) zzz();
Und da ziel und der Returnwert von zzz beide unsigned int sind, kannst du dir das Casten auch sparen:
C++:
ziel = zzz();

Gruß
 
danke für die Hilfe :)

Jetzt funktioniert alles. Das einzige Problem ist, dass die Zufallszahl immer die selbe ist. Gibts da noch eine Lösung?
 
Zurück