• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

srand funktioniert bei kleinen Intervallen besser

  • Ersteller moescream
  • Erstellt am

moescream

Gast
Hi! Ich habe srand benutzt um ein Array von 10 Elementen mit Zufallszahlen zu füllen und dabei bemerkt, dass die Zufallszahlen umso besser verteilt sind, je kleiner ich das Intervall wähle, in dem sie liegen sollen. Das wundert mich jetzt ein bisschen, weil ich dachte, das srand als seed die aktuelle systemzeit benutzt und dann die Intervallbreite ja völlig irrelevant wäre. Vielleicht weiß ja von euch jemand, wie das zusammen hängt.
Außerdem wollte ich anfangs erst das Makro RAND_MAX in der stdlib.h vom Wert 0x7ffffff auf 0x7fff ändern (denn das hätte der Vorgabe von meinem Prof entsprochen), musste dann aber feststellen, dass ich die stdlib nicht verändern kann und auch keine Kopie davon abspeichern kann. Wie muss ich denn sowas anstellen?
Ich hab euch unten noch den Code von meiner int Zufallszahl Funktion geposten, falls ihr das mal ausprobieren wollte.
Servus!
mo
PS: Leider kann ich euch erst nächsten WE wieder antworten, weil ich gerade ein Praktikum machen muss und unter der Woche keinen Internetanschluss hab. :mad: Also nicht wundern, wenn nicht gleich was zurückkommt!


# include <stdio.h>
# include <stdlib.h>
# include <time.h>

int Zufallszahl (int iStart, int iEnd);


int main ()
{
int iAnfang=0, iEnde=0, iAFeld[10], iAnzahl=0, i=0, f=0, iJump=0;
for (i=0; i<=9; i++)//Array initialisieren
iAFeld=0;


//Anzahl der Zufallszahlen erfragen
printf("\n\nWieviele Zufallszahlen sollen generiert werden?\n");
while (f==0)
{
f=(scanf(" %d", &iAnzahl));
if (f==0)
{
scanf(" %*s");//Error-Handling
printf("\nBitte geben Sie eine ganze Zahl ein, um die Anzahl der erzeugten Zufallszahlen zu bestimmen!\n");
}
}
if (iAnzahl<=0)
{
printf("Bitte geben Sie eine positive ganze Zahl ein. Starten Sie dazu das Programm neu!\n");
iJump=1;
}

f=0;

if (iJump==0)//falls eben keine negative Zahl eingegeben wurde gehts jetzt weiter...
{
//Intervall eingeben
printf("\nBitte geben Sie eine untere Intervallgrenze ein.\n");
while (f==0)
{
f=(scanf(" %d", &iAnfang));
if (f==0)
{
scanf(" %*s");//Error-Handling
printf("Bitte geben Sie eine ganze Zahl als untere Intervallgrenze ein!\n");
}
}

f=0;

printf("Bitte geben Sie jetzt eine obere Intervallgrenze ein.\n");
while (f==0)
{
f=(scanf(" %d", &iEnde));
if (f==0)
{
scanf(" %*s");//Error-Handling
printf("Bitte geben Sie eine ganze Zahl als obere Intervallgrenze ein!\n");
}
}

//Zufallszahlen ausgeben
f=Zufallszahl(iAnfang, iEnde);//falls die Intervallbedingungen erfüllt werden kanns losgehen...
if (f!=0)
{
for (i=0; i<iAnzahl; i++)
{
*(iAFeld+i)=Zufallszahl(iAnfang, iEnde);//Zufallszahlen abholen und Array befüllen
printf("Zufallszahl Nummer %d lautet: %d\n", i+1, *(iAFeld+i));
}
}
if (f==0)
iJump=2;
}

return iJump;
}








int Zufallszahl (int iStart, int iEnd)
{
int i=0, n=0, iJump=0;

//Intervallgrenzen prüfen
if (iStart>=iEnd)
{
printf("Die Intervalluntergrenze ist groesser als die Obergrenze! Das Programm wird beendet.\n");
iJump=-1;
}

if (iJump==0)//Zufallszahl generieren falls die obigen Bedingungen erfüllt werden
{
i=iStart+32768;
if (iEnd>i) //Das Intervall wird laut Angabe auf eine Breite von 32768 begrenzt, der Versuch RAND_MAX in der <stdlib> anzupassen scheiterte, desshalb dieser Umweg...
{
printf("Das Intervall ist zu gross. Bitte waehlen Sie (bei gegebener Intervalluntergrenze) als obere Intervallgrenze eine Zahl kleiner als %d. Starten Sie dazu das Programm neu!\n", i);
iJump=-1;
}

if (iJump==0)//Zufallszahl generieren falls die obigen Bedingungen erfüllt werden
{
i=iEnd-iStart-1;
srand ((unsigned) time (NULL));
{
do
n=rand();
while ((n>i)||(n==-iStart)); //Zufallszahl muss innerhalb der Intervallbreite liegen
n=n+iStart;
}
}
}
return n;
}