2016-07-25 19 views
4
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
    int i; 
    int diceRoll; 

    for(i=0; i < 20; i++) 
    { 
     printf("%d \n", rand()); 
    } 

    return 0; 
} 

Dies ist der Code ich in c geschrieben (Codeblöcken) Zufallszahl zu bekommen, ist das Problem, das ich immer die gleiche Sequenz erhalten: 41,18467,6334,26500 etc ...Zufallszahlenliste

Ich bin immer noch lernen Versuchen Sie bitte zu erklären, wie Sie mit einem 8 Jahre alten D sprechen:

+1

Soll das C++ Code oder C# sein? Es scheint, Sie schreiben C++ - Code und Sie haben es als C++ markiert, aber der Titel und die Frage sagen C#. –

+0

Überprüfen Sie dies: http://stackoverflow.com/questions/1716308/how-does-a-random-number-generator-work –

+0

[Verwenden Sie nicht 'rand()'] (https: //channel9.msdn. com/Events/GoingNative/2013/Rand-Considered-Harmful) – ArchbishopOfBanterbury

Antwort

5

Sie erhalten jedes Mal die gleiche Sequenz, weil der Startwert für den Zufallsgenerator nicht gesetzt ist. Sie müssen srand(time(NULL)) so nennen:

int main() 
{ 
    srand(time(NULL)); 
    .... 
+0

Danke, es funktioniert. Ich folge einem Tutorial auf Youtube, und der Typ hat diese Zeile nicht geschrieben. –

+0

@ArshdeepSinghOutarel das ist ein gutes Zeichen, Sie sollten nach einem anderen Tutorial suchen. – user4581301

+0

Mein Rat ist es, Video-Tutorials zu vermeiden. Stattdessen lies ein einleitendes 'C++' Buch von hier: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – drescherjm

-1

Zunächst einmal Samen Ihre Zufallsfunktion von <ctime> einschließlich und ruft srand(time(NULL));.

Zweitens benötigen Sie ein Modulo, wenn Sie rand() aufrufen möchten, zum Beispiel: rand()% x gibt eine Zufallszahl von 0 bis x-1 zurück. Da Sie Würfellollen simulieren, tun Sie rand() % 6 + 1.

+0

Ja, ich weiß über%. Aber es funktioniert ohne , ich verwende nur srand (Zeit (NULL)); –

1

Zufallszahlengeneratoren sind pseudozufällig. Das bedeutet, dass sie einen "Algorithmus" verwenden, um die nächste "zufällige" Zahl zu erstellen. Mit anderen Worten, wenn Sie mit dem gleichen Startwert für diesen Algorithmus beginnen, erhalten Sie jedes Mal dieselbe Sequenz von Zufallszahlen. Um dies zu lösen, müssen Sie sicherstellen, dass Sie Ihren Zufallsgenerator erzeugen. Manchmal ist es wünschenswert, den gleichen Seed zu verwenden, damit Sie ableiten können, ob die Logik Ihres Programms korrekt funktioniert. So oder so, eine gemeinsame Methode, die Leute ihre Programme säen, ist durch die Verwendung von Zeit (NULL). Zeit gibt die verstrichene Zeit (in Sekunden) seit der Epoche an. Das bedeutet, dass sich diese Funktion jede Sekunde ändert. Wenn Sie also Ihren Zufallsgenerator mit (srand (time (NULL)) am Anfang des Programms einsetzen, erhalten Sie für jede Sekunde, in der Sie Ihr Programm ausführen, eine andere Zufallszahlenfolge Zufallszahl, die Sie anfordern. Tun Sie das einfach einmal ganz am Anfang Ihres Codes und lassen Sie es dann in Ruhe.

Ihr Titel sagt C#, aber ich habe mit C++ geantwortet. Sie sollten ctime für diese einschließen Es mag auch nützlich sein, den neuen Stil der Zufallszahlengenerierung zu betrachten, da rand() in diesen Tagen nicht sehr zufällig ist. Schauen Sie in #include random und machen Sie sich eine Engine und eine Distribution, um Zufallszahlen durchzuspielen auch dort!

-1

Die Leitung srand((unsigned)(time(NULL)) muss außerhalb der Schleife sein, muss habe diese Zeile nur einmal in deinem Code.

Die Modulo rand()%10 bedeutet, dass Sie von 0 gehen bis zu Beginn jeder Nummer bekommen, was Sie von -1 Modulo werden. Also in diesem Fall 0-9, wenn Sie 1-10 möchten Sie tun: rand()%10 + 1

int main() 
{ 
    int i; 
    int diceRoll; 

    srand((unsigned)(time(NULL)); 

    for(i=0; i < 20; i++) 
    { 
     printf("%d \n", rand() % 10); //Gets you numbers 0-9 
    } 

    return 0; 
}