ANSI C i random
ANSI C i random
Może ktoś mi wytłumaczyć ten kawałek kodu bo nie kumam tego kawałka kodu ??
#define LOSUJ( a, b ) ( rand()%( (b)-(a)+1 ) + (a) )
#define LOSUJ( a, b ) ( rand()%( (b)-(a)+1 ) + (a) )
Funkcja LOSUJ(a, b) przyjmuje dwa parametry, następnie oblicza wyrażenie ((b)-(a)+1 ) + (a) i losuje z zakresy od 0 do wynik -1.
funkcja rand() losuje dowolna liczbę z podanego zakresu.
przykłąd:
(1)-(1)+1)+1) = 2
LOSUJ(1, 1) ( rand()%(2) )
wynikiem będzie liczba z zakresu od 0 do 1.
znak % znaczy modulo czyli bierzesz pod uwagę liczby z zakresu 0, 1.
Mam nadzieje że trochę ci rozjaśniłem sytuacje.
funkcja rand() losuje dowolna liczbę z podanego zakresu.
przykłąd:
(1)-(1)+1)+1) = 2
LOSUJ(1, 1) ( rand()%(2) )
wynikiem będzie liczba z zakresu od 0 do 1.
znak % znaczy modulo czyli bierzesz pod uwagę liczby z zakresu 0, 1.
Mam nadzieje że trochę ci rozjaśniłem sytuacje.
No to napewno tak nie jest dlatego że zrobiłem sobie program:
[center:d63ec81981][/center:d63ec81981]
W wyniku działania otrzymałem:
[center:d63ec81981][/center:d63ec81981]
Więc z przedziału od -3 do 10
[center:d63ec81981]
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LOSUJ( a, b ) ( rand()%( (b)-(a)+1 ) + (a) )
main(){
int t[4][4],i,j,k,k1,tmp,w,w1;
srand( time(0) );
for(i=0; i<4; ++i ){
for(j=0; j<4; j++)t[i][j]= LOSUJ( -3, 10 );
}
for(i=0; i<4; ++i ){
printf("\n");
for(j=0; j<4; j++)printf("t[%d][%d]%d \t",i,j,t[i][j]);
}
return 0;
}
W wyniku działania otrzymałem:
[center:d63ec81981]
Kod: Zaznacz cały
t[0][0]4 t[0][1]-3 t[0][2]7 t[0][3]10
t[1][0]0 t[1][1]10 t[1][2]-2 t[1][3]7
t[2][0]4 t[2][1]2 t[2][2]3 t[2][3]-3
t[3][0]8 t[3][1]1 t[3][2]9 t[3][3]-3
Więc z przedziału od -3 do 10
A przeczytał wynik polecenia
?
Kod: Zaznacz cały
man rand
-
- Beginner
- Posty: 207
- Rejestracja: 26 czerwca 2006, 01:49
- Lokalizacja: Kraków za firewallem
zauważyłem drobny błąd w tłumaczeniu luck40
pamiętaj o priorytetach operatorów. "%" ma wyższy priorytet niż "+"
czyli samo "ciało" makra:
żeby to bardziej zobrazować, weźmy tak:
nie wiem, czy takie zagnieżdżanie makr jest dopuszczalne, bo siedzę w C++ i nieużywam praktycznie wcale makr, ale ma to ukazać dokładnie ten algorytm
Kod: Zaznacz cały
#define LOSUJ( a, b ) ( rand()%( (b)-(a)+1 ) + (a) )
czyli samo "ciało" makra:
Kod: Zaznacz cały
rand() % ((b)-(a)+1) /*tu się kończy to co bezpośrednio po %*/ +(a)
Kod: Zaznacz cały
#define X ((b)-(a)+1)
#define LOSUJ(a,b) (rand() % X + (a))
fakt pogubiłem się nieco przy ilości nawiasów, sorki ogromneroni pisze:zauważyłem drobny błąd w tłumaczeniu luck40
Kod:
#define LOSUJ( a, b ) ( rand()%( (b)-(a)+1 ) + (a) )
pamiętaj o priorytetach operatorów. "%" ma wyższy priorytet niż "+"
czyli samo "ciało" makra:
Kod:
rand() % ((b)-(a)+1) /*tu się kończy to co bezpośrednio po %*/ +(a)