rand mit Samen nicht wieder random wenn-Funktion geloopt
Schrieb ich diesen C-code unten, wenn ich Schleife, es gibt eine zufällige Zahl. Wie kann ich erreichen, das 5 verschiedene zufällige Werte wenn myrand() ausgeführt wird?
#include <stdio.h>
#include <stdlib.h>
int myrand() {
int ue_imsi;
int seed = time(NULL);
srand(seed);
ue_imsi = rand();
return ue_imsi;
}
int main()
{
int value = 0;
int i=0;
for (i=0; i< 5; i++)
{
value =myrand();
printf("value is %d\n", value);
}
}
- Seed einmal in Ihrem Leben, nicht die ganze Zeit.
- Sie initialisiert den Zufallszahlen-generator mit der gleichen Nummer immer und immer wieder (solange
time(NULL)
denselben Wert zurück). Tun Sie das nicht wenn Sie wollen, die zahlen zu schauen, wie zufällig. Denken Sie auch an#include <time.h>
fürtime()
Prototyp. - mögliche Duplikate von Immer wiederholt angegebenen zahlen von rand(). Bitte verwenden Sie die Suchfunktionen SO, bevor Sie eine Frage stellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seeding der generator sollte einmal vorgenommen werden(für jede Sequenz von Zufallszahlen, die Sie generieren möchten natürlich!):
Bewegen Sie den
srand()
call-in -main()
vor der Schleife.In anderen Worten, rufen Sie
srand()
einmal und dann rufenrand()
wiederholt werden, ohne jegliche weitere Anrufe zusrand()
:time()
mehrere Male in schneller Folge, es wird wahrscheinlich wieder den gleichen Wert, da die Uhr noch nicht abgehakt. Wenn Sie anrufensrand()
mit dem gleichen seed, den folgenden Aufruf zurand()
wird den gleichen Wert zurückgeben. Als ich sagte, versuchen Sie nicht, initialisieren Sie den generator jedes mal, wenn Sie benötigen einen zufälligen Wert.Den Punkt seed() dient zum starten der Sequenz von Zufallszahlen, die mit einem bekannten Wert,
Sie wird dann immer die gleiche Folge von zahlen gegeben, die gleichen Samen.
Dies ist, warum Sie haben (seed), die es beiden ermöglicht Ihnen das generieren der gleichen Reihenfolge für die Prüfung, oder ein random-seed (in der Regel die Zeit) erhält man eine andere Reihenfolge jedes mal, wenn
Versuchen Sie dies:
Meine "Vermutung" ist, dass 10 gleiche Werte gedruckt werden 🙂
Wenn Sie wollen, um erneutes Seeding (für extra Zufälligkeit) jedes mal, wenn Sie rufen
random()
, hier ist ein Weg, wie man das tun könnte:time()
updates einmal pro Sekunde, aber wird anders sein, jedes mal, wenn Sie Ihr Programmclock()
updates viel häufiger, aber bei 0 beginnt jedes mal, wenn Sie Ihr Programmrandom()
macht Sie sicher, dass Sie (in der Regel) nicht reseed mit dem gleichen Wert zweimal in einer Zeile, wenn Sie Ihre Schleife ist schneller als die Granularität derclock()
Natürlich könnte man mehr tun, wenn Sie wirklich, wirklich wollen Zufälligkeit-aber das ist ein Anfang.
clock()
nicht viel hinzuzufügen Wert hier, da es grob deterministische wenn Ihr Programm nicht irgendwelche I/O-Verzögerungen.getpid()
wäre wahrscheinlich eine gute Ergänzung zu beheben, die Grenzen dertime()
.