Co oznacza rand ()% zakres + niższy? [Zamknięte]

Dec 18 2020

Uczę się C w tej chwili i nie rozumiem, co oznacza rand() % range + lowerten wiersz kodu.

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);

Odpowiedzi

SergeBallesta Dec 18 2020 at 18:24

To jest losowy generator liniowy dla biednych.

Jest rzeczywiście losowy, ponieważ jest zasilany, z rand()którego zwraca losową liczbę całkowitą, a konstrukcja ma wartość> = dolna i <= górna.

Ale nadal jest to narzędzie dla biednych, ponieważ wartości w [dolnym, górnym] przedziale mogą mieć różne prawdopodobieństwa.

Krótka historia, może być używana, jeśli potrzebujesz tylko losowych wartości, ale nie powinno być, jeśli potrzebujesz kryptograficznego bezpiecznego losowego źródła.

JhnW Dec 18 2020 at 18:32

Przeczytaj o operatorze%. Jest to podział modulo. Dzielenie modulo jest dobrym narzędziem do jednolitego mapowania największego zakresu do najkrótszego zakresu (w twoim przypadku rand ()% zakresu ). Wystarczy dodać początek zakresu, aby przesunąć wszystkie wartości na prawidłowe pozycje. Kod rand ()% range + lower to standardowy idiom języka C do pobierania liczb losowych z zakresu A, B. Możesz znaleźć więcej idiomów, na przykład dla liczb zmiennoprzecinkowych z zakresem (A, B) lub zakresem <A, B>.