ANSI C i random

Potrzebujesz pomocy z C, C++, perl, python, itp.
naibed
Posty: 16
Rejestracja: 11 stycznia 2007, 11:58
Lokalizacja: £ÓD¬

ANSI C i random

Post autor: naibed »

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
Beginner
Posty: 120
Rejestracja: 14 listopada 2006, 17:29
Lokalizacja: okolice Czêstochowy

Post autor: luck40 »

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
Posty: 16
Rejestracja: 11 stycznia 2007, 11:58
Lokalizacja: £ÓD¬

Post autor: naibed »

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
Beginner
Posty: 120
Rejestracja: 14 listopada 2006, 17:29
Lokalizacja: okolice Czêstochowy

Post autor: luck40 »

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
Posty: 16
Rejestracja: 11 stycznia 2007, 11:58
Lokalizacja: £ÓD¬

Post autor: naibed »

No to napewno tak nie jest dlatego że zrobiłem sobie program:

[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;
}
[/center:d63ec81981]

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 
[/center:d63ec81981]

Więc z przedziału od -3 do 10
luck40
Beginner
Posty: 120
Rejestracja: 14 listopada 2006, 17:29
Lokalizacja: okolice Czêstochowy

Post autor: luck40 »

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
Beginner
Posty: 262
Rejestracja: 15 sierpnia 2006, 16:14
Lokalizacja: Kraków

Post autor: Lorenzo »

A przeczytał wynik polecenia

Kod: Zaznacz cały

man rand
?
Witek Baryluk
Beginner
Posty: 207
Rejestracja: 26 czerwca 2006, 01:49
Lokalizacja: Kraków za firewallem

Post autor: Witek Baryluk »

LOSUJ to nie jest funkcja, tylko makro. Co do rand to warto poczytać manual (np. uwagi).
roni
Posty: 23
Rejestracja: 26 stycznia 2007, 14:26
Lokalizacja: Wroc³aw (Z³otoryja)

Post autor: roni »

zauważyłem drobny błąd w tłumaczeniu luck40

Kod: Zaznacz cały

#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: Zaznacz cały

rand() % ((b)-(a)+1) /*tu się kończy to co bezpośrednio po %*/ +(a)
żeby to bardziej zobrazować, weźmy tak:

Kod: Zaznacz cały

 #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
Beginner
Posty: 120
Rejestracja: 14 listopada 2006, 17:29
Lokalizacja: okolice Czêstochowy

Post autor: luck40 »

roni 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)
fakt pogubiłem się nieco przy ilości nawiasów, sorki ogromne
ODPOWIEDZ