2013-07-24 15 views
12
#include <stdio.h> 
#include <stdlib.h> 

int main() 

{ 
    int randomnumber; 
    randomnumber = rand() % 10; 
    printf("%d\n", randomnumber); 
    return 0; 
} 

Dies ist ein einfaches Programm, in dem eine nicht initialisierte Random int Variable ist, die jedoch zwischen 1 und 10 als eine Zufallszahl gedruckt werden soll, ist es immer druckt die gleiche Nummer, wenn ich immer und immer wieder renne. Kann mir bitte jemand helfen und mir sagen, warum das passiert? Vielen Dank.eine Zufallszahl zwischen 1 und 10 in c erzeugen

+6

Lesen Sie mehr über [ 'srand()'] (http: // en. cppreference.com/w/c/numeric/random/srand). – jxh

+2

Sie haben wahrscheinlich eine Verzerrung in dieser Auswahl. – chris

+2

@chris: Ja, aber die Tendenz in diesem Fall ist ziemlich gering; da 'RAND_MAX' mindestens 32767 ist, beträgt die Abweichung weniger als ein Teil von 3000, und wenn Sie Pseudozufallszahlen mit besserer Qualität als diese benötigen, sollten Sie wahrscheinlich etwas Besseres als' rand() 'verwenden. Dennoch lohnt es sich, sie anzusprechen, besonders wenn Sie einen größeren Bereich (in der Nähe von 'RAND_MAX') wünschen. Die Frage 13.16 der [comp.lang.c FAQ] (http://www.c-faq.com/) zeigt, wie man das macht. –

Antwort

13

Sie benötigen bei jeder Ausführung einen anderen Startwert.

können Sie beginnen am Anfang des Programms zu nennen:

srand(time(NULL)); 

Beachten Sie, dass % 10 ein Ergebnis 0-9 ergibt und nicht 1-10: nur 1 Ausdruck zu Ihrem % hinzufügen 1 zu erhalten zu 10.

+0

danke, aber wenn ich srand (Zeit (NULL)) hinzufügen; Gleich nachdem ich die Variable randomnumber deklariert habe, gibt mir der Compiler den Fehler, dass die implizite Konvertierung die ganzzahlige Genauigkeit verliert: 'time_t (aka' long ') zu' unsigned int ' – Nisarg

+1

@Nisarg; Verwenden Sie 'srand ((vorzeichenlose) Zeit (NULL))'. 'srand()' nimmt einen 'unsigned'-Wert als Argument. – haccks

+0

@Nisarg können Sie diese Nachricht ignorieren oder das Funktionsargument auf 'unsigned int' umstellen, um sie zu deaktivieren. – ouah

1

Sie müssen den Zufallszahlengenerator impfen, von man 3 rand

Wenn kein Startwert versehen ist, wird die Funktion rand() automatisch mit einem Wert von 1 beimpft

und

Die Funktion srand() setzt ihr Argument als Keim für eine neue Folge von Pseudozufallszahlen, die von rand() zurückgegeben werden. Diese Sequenzen sind wiederholbar, indem srand() mit demselben Startwert aufgerufen wird.

z.B.

srand(time(NULL)); 
+0

danke für die Erklärung! – Nisarg

0

Das Generieren einer einzelnen Zufallszahl in einem Programm ist problematisch. Zufallszahlengeneratoren sind nur "zufällig" in dem Sinne, dass wiederholte Aufrufe Zahlen aus einer gegebenen Wahrscheinlichkeitsverteilung erzeugen.

Das Aussenden des RNG wird nicht helfen, besonders wenn Sie ihn einfach von einem Timer mit niedriger Auflösung ausseuchen. Sie erhalten nur Zahlen, die eine Hash-Funktion der Zeit sind, und wenn Sie das Programm oft aufrufen, können sie sich nicht oft ändern. Sie könnten ein wenig verbessern, indem Sie srand(time(NULL) + getpid()) (_getpid() unter Windows) verwenden, aber das wird immer noch nicht zufällig sein.

Die einzige Möglichkeit, Zahlen, die zufällig sind über mehrere Aufrufe eines Programms ist es, sie von außerhalb des Programms zu bekommen. Das bedeutet, einen Systemdienst wie /dev/random (Linux) oder CryptGenRandom() (Windows) oder einen Dienst wie random.org zu verwenden.

+0

danke lee wissen Sie, wie man einen Systemdienst benutzt, um einen legitimen Zufallszahlengenerator auf einem MAC zu bekommen? Zu Ihrer Information: Ich benutze Xcode. – Nisarg

+0

Ich bin kein Mac-Typ, aber ich glaube, sie sind Unix-ähnlich genug, dass sie ein '/ dev/random' oder'/dev/urandom' haben. –

+0

kein Problem, Lee. Vielen Dank. – Nisarg

0

Hier ist ein bereit Quellcode für Zufallszahlengenerator laufen c von dieser Seite genommen werden: http://www.random-number.com/random-number-c/ . Die Umsetzung ist hier allgemeinere (eine Funktion, die 3 Parameter erhält: min, max und Anzahl von Zufallszahlen zu erzeugen)

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

// the random function 
void RandomNumberGenerator(const int nMin, const int nMax, const int nNumOfNumsToGenerate) 
{ 
    int nRandonNumber = 0; 
    for (int i = 0; i < nNumOfNumsToGenerate; i++) 
    { 
    nRandonNumber = rand()%(nMax-nMin) + nMin; 
    printf("%d ", nRandonNumber); 
    } 
    printf("\n"); 
} 

void main() 
{ 
    srand(time(NULL)); 
    RandomNumberGenerator(1,70,5); 
} 
0
srand(time(NULL)); 

int nRandonNumber = rand()%((nMax+1)-nMin) + nMin; 
printf("%d\n",nRandonNumber); 
Verwandte Themen