Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Problem z losowaniem + sqrt

Ostatnio zmodyfikowano 2013-11-01 03:54
Autor Wiadomość
james5
Temat założony przez niniejszego użytkownika
[C] Problem z losowaniem + sqrt
» 2013-11-01 00:29:50
Po pierwsze, chciałem się przywitać :)
Ale do rzeczy, mam 2 problemy:
1. Czy jeżeli losuję liczbę rzeczywista w zakresie od -a do a, czyli <-a, a> ( wystarczy 2 miejsca po przecinku gdyż nie musi być za dokładna ) to mogę zrobić tak: double l1=rand() % 200*a -100.0*a)/100.0; ??? wczesniej czywiscie uzylem srand (time(NULL));
zastanawiałem się nad takim czymś: l1=rand()%2*a-a+1+(double)rand()/RAND_MAX;, ale wtedy występuje jeszcze większy zakres błędu(fukncji ktora sumuje pkty sumujące jakaś tam zależność -> więcej pktow to dokładniejsza odpowiedź, a tu niekoniecznie), ale wtedy na 100% jest problem w pkt. 2
2. Wyskakuje mi taki warning:  "incompatible implicit declaration of built-in function 'sqrt' [enabled by default]|"
w tej linijce mam coś takiego: double V=sqrt((l1*l1+l2*l2)); l1 i l2 są typu double

Z góry dziękuję za wyjaśnienie mi błędów :)

@Edit2
OK. Przypomniałem sobie, że modula ma najwyższy priorytet, więc 200*a mmuszę dać w nawias, aaaale zmienna a jest typu double i wyskakuje kolejny błąd :/ chyba po prostu dam (int) przed nawiasem, a część ułamkową niech sobie zje... chyba, że ktoś ma lepszy pomysł :)
P-95005
den93
» 2013-11-01 03:54:35
1. Chyba bym to zrobił raczej w taki sposób:
C/C++
double zk = 100.0, los; // zakres np. <-100; 100>
srand( GetTickCount() ); // GetTickCount() czy time(0) wszystko jedno
double s = rand() << 15 | rand(); // będzie tak jeśli RAND_MAX = 32767; daje nam to 2^30 możliwości czyli nie mniej niż 8 cyfrową dokładność double np. 1234.5678, 123.12345, 1.1234567
s /= 0x3FFFFFFF; // <0; 1>
los = 2.0 * zk * s - zk; // (dla zk = 100.0): <0; 1> * 2*100 - 100 = <0; 200> - 100 = <-100; 100>

// to samo w jednej linijce
los = double( rand() << 15 | rand() ) / 0x3FFFFFFF * zk * 2.0 - zk;
P-95006
« 1 »
  Strona 1 z 1