Was bedeutet Rand ()% Bereich + niedriger? [geschlossen]
Ich lerne gerade C und verstehe nicht, was das rand() % range + lower
in dieser Codezeile bedeutet.
printf("I will generate 10 random numbers between %d and %d . . .\n", lower, upper);
int range = upper - lower+1;
for(int i = 0; i <= 10; i++) {
int number = rand() % range + lower;
printf("%d\t", number);
Antworten
Dies ist der lineare Zufallsgenerator eines armen Mannes.
Es ist in der Tat zufällig, weil es gespeist wird, von rand()
dem eine zufällige ganze Zahl zurückgegeben wird, und konstruktionsbedingt ist der Wert> = niedriger und <= oben.
Aber es ist immer noch ein Werkzeug für arme Männer, da die Werte im [unteren, oberen] Intervall unterschiedliche Wahrscheinlichkeiten haben können.
Kurz gesagt, es kann verwendet werden, wenn Sie nur einige zufällige Werte benötigen, sollte es aber nicht sein, wenn Sie eine kryptografisch sichere Zufallsquelle benötigen.
Bitte lesen Sie abut% operator. Es ist Modulo Division. Die Modulo-Division ist ein gutes Werkzeug, um den größten Bereich gleichmäßig auf den kürzesten Bereich abzubilden (in Ihrem Fall rand ()% range ). Sie müssen nur den Start des Bereichs hinzufügen, um alle Werte an die richtigen Positionen zu verschieben. Code rand ()% range + lower ist das Standard-C-Idiom, um Zufallszahlen aus dem A-, B-Bereich zu erhalten. Weitere Redewendungen finden Sie beispielsweise für Gleitkommazahlen mit dem Bereich (A, B) oder dem Bereich <A, B>.