C hibás véletlen-szám generálás?
Van egy eléggé komplex kódom, amiben hiba van és nem jövök rá, hogy mi az. Az egész a véletlen-számokra épül. Az egyik alapeloszlásban van egy törés, aminek nem kellene ott lennie. Emiatt megnéztem egy sima egyenletes eloszlást, ahol talán még én sem hibázhattam és ott is van egy ugrás... Nézzétek meg kérlek:
for (int i=0; i<1000000000; i++) {
double A, B;
int D;
B=rand() % 10000000;
A=B/10000000.0;
D=floor(A*180.0);
test[D]+=1;
}
for(int i=0; i<180; i++)
{
fprintf(T, "%lf\n", test[i]);
}
Az eredmény:
Egyértelműen van benne egy ugrás, ami bár nem nagy, mégis okozhat hibát és egész biztosan nem kellene ott lennie. Vélemény? Mi lehet az oka?
Itt a kód eleje is:
srand(time(NULL));
FILE *T;
T=fopen("T.d", "w+");
double test[180];
for(int i=0; i<180; i++)
{
test[i]=0;
}
Első ránézésre cikluson kívülre az alábbi két sor:
double A, B;
int D;
mivel 1 000 000 000 - szor deklarálod őket.
A kód szerintem azt csinálja amit kell neki.
Legfelljebb nem ezt akartad.
Ha megosztod, mit szeretnél megoldani, talán tudok segíteni.
Mert ez nem tizedesjegyekben számol.
Bináris formában elég pontatlanak a törtszámok.
Példának okáért 0.1+0.2 nem egyenlő 0.3mal (0.2996 körül van ha jól rémlik).
A helyes válasz már elhangzott a 4-es hozzászólásban. Nem egyenletes eloszlással generálod a számokat.
A rand() függvény 0 és RAND_MAX között generál számokat. Eddig még megvan az egyenletes eloszlás. Na most te ezeket veszed modulo X. Itt X nem osztja RAND_MAX-ot, ezért a kisebb számok nagyobb eséllyel fognak előfordulni a végeredményben.
A megértéshez: pl mi történik, ha 1 és 5 közötti számokat veszed modulo 2? A páratlanból több van 1 és 5 között, így modulo után nagyobb eséllyel kapsz 1-et, mint 0-t.
A megoldás pedig: rand() / (RAND_MAX + 1.0)
Ezt a modulo 2 dolgot nem értem. Ez mit jelent?
Szövegkörnyezet alapján 5 modulo 2 az 1, mert 5/2-nek 1 a maradéka?
Illetve a rand_max alatt gondolom arra az értékre gondoltok, amit a rand() után írunk. Ha ez 10 millió, akkor miért 10 millió+1-el kell osztani? Vagy félreértek valamit?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!