rozkład rówomierny

0

chciałam napisać rozkład równomiermy na przedziale [0,1] zgodnie z algorytmem jednak coś tu nie gra, poniższy kod generuje jakieś dziwne liczby

double wsp_q=127773;
double wsp_r=2836;
double zakres=2147483647;

double los_j(void){
static int x=3566;
int h;
h=int(x/wsp_q);
x=16807*(x-wsp_qh)-wsp_rh;
if(x<0) x=x+zakres;
return (long double)x/(long double)zakres;
}

0

Ale może daj opis tego algorytmu, którego chcesz użyć do generowania liczb. Z kodu to raczej trudno wyczytać, zwłaszcza, że jak sama mówisz, nie działa prawidłowo.

0

algorytm jest poprawnie zaimplementowany, tylko jak wyświetlić wynik?,
próba cout-em, daje liczbę ujemną, a przecież z tego programu nie ma takiej opcji żeby powstała liczba ujemna, może to wina kompilatora???

0

Używasz za dużych liczb. W pewnym miejscu pewnie następuje przepełnienie. int mieści maksymalnie 4294967295, zaledwie 2 razy więcej niż zmienna 'zakres'. Zadeklaruj wszystkie zmienne jako long double.

0
Po pewnych poprawkach daje 1.
Ale nie wiem czy to poprawny wynik
#include <iostream.h>
#include <conio.h>


double wsp_q=127773;
double wsp_r=2836;
double zakres=2147483647;
double los_j(void);
static float x=3566;
int main()
{
 los_j();
 cout<<x/zakres;
 getch();
}
double los_j(void)
{

 float h;
 h=(x/wsp_q);
 x=16807*(x-wsp_q*h)-wsp_r*h;
 if(x<0) x=x+zakres;
 return x/zakres;
}
0

long double=64 bity i juz

1 użytkowników online, w tym zalogowanych: 0, gości: 1