|
ANSI C i random
naibed - 25-01-2007 08:18
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) )
luck40 - 25-01-2007 09:02
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.
naibed - 25-01-2007 09:14
Ale jak zrobię LOSUJ(-3,10) to losuje mi z przedziału od -3 do 10 dało by to na przykładzie -3 do 10 opisać ??
luck40 - 26-01-2007 03:42
Funkcja losuje z zakresu od 0 do wyniku jaki da to ->((b)-(a)+1 ) + (a) wyrażenie, a nie z przedziału jaki podajesz. a = -3; b = 10
((10)-(-3)+1)+(-3) = 11
czyli funkcja będzie losować z zakresu od 0 do 11.
naibed - 26-01-2007 11:25
No to napewno tak nie jest dlatego że zrobiłem sobie program:
[center:d63ec81981]
#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; }
[/center:d63ec81981]
W wyniku działania otrzymałem:
[center:d63ec81981]
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
[/center:d63ec81981]
Więc z przedziału od -3 do 10
luck40 - 26-01-2007 21:00
Ja patrzyłem na ten kod z perspektywy C++, i jak napisałem to w C++ to działało tak jak opisałem.
Wiec mogłem się mylić. Jeśli tak było to przepraszam :)
Lorenzo - 26-01-2007 21:17
A przeczytał wynik polecenia man rand
?
Witek Baryluk - 27-01-2007 18:56
LOSUJ to nie jest funkcja, tylko makro. Co do rand to warto poczytać manual (np. uwagi).
roni - 27-01-2007 22:57
zauważyłem drobny błąd w tłumaczeniu luck40 #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: rand() % ((b)-(a)+1) /*tu się kończy to co bezpośrednio po %*/ +(a)
żeby to bardziej zobrazować, weźmy tak: #define X ((b)-(a)+1) #define LOSUJ(a,b) (rand() % X + (a))
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
luck40 - 28-01-2007 18:08
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)
fakt pogubiłem się nieco przy ilości nawiasów, sorki ogromne
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|