Was bedeutet Rand ()% Bereich + niedriger? [geschlossen]

Dec 18 2020

Ich lerne gerade C und verstehe nicht, was das rand() % range + lowerin 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

SergeBallesta Dec 18 2020 at 18:24

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.

JhnW Dec 18 2020 at 18:32

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>.