Kezdőoldal » Számítástechnika » Programozás » C hibás véletlen-szám generálás?

C hibás véletlen-szám generálás?

Figyelt kérdé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:

[link]

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?


2018. okt. 28. 14:03
1 2
 1/12 A kérdező kommentje:

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;

}

2018. okt. 28. 14:05
 2/12 SimkoL ***** válasza:
34%

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.

2018. okt. 28. 14:34
Hasznos számodra ez a válasz?
 3/12 anonim ***** válasza:

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.

2018. okt. 28. 14:59
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:
100%
A modulo számítás után már nem lesznek egyenletes eloszlásúak a számok, mivel a MAX_RAND értéke nem osztható 10000000-val.
2018. okt. 28. 16:15
Hasznos számodra ez a válasz?
 5/12 A kérdező kommentje:
Köszönöm hármas, de abban nem tudsz segíteni. Közben arra sikerült rájönnöm, hogy a generált véletlen-szám pontossága okozza ezt. Ugye generálok 10 millióig egy számot, majd osztom is 10 millióval, így kapok 0 és 1 közötti számot 7 tizedesjeggyel. Amikor ezt lejjebb vettem csak 5 tizedesre, akkor ez a hiba megszűnt. Az érdekelne, hogy ez miért van. Nem igazán ismerem ilyen szinten a dolog programozási hátterét.
2018. okt. 28. 16:18
 6/12 anonim ***** válasza:

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).

2018. okt. 28. 16:40
Hasznos számodra ez a válasz?
 7/12 anonim ***** válasza:

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.

2018. okt. 28. 17:11
Hasznos számodra ez a válasz?
 8/12 A kérdező kommentje:
Köszönöm, de nem teljesen értem a dolgot. Ha ez így nem jó, akkor hogyan tudok 0 és 1 között mondjuk 5 tizedesjegyig véletlen számokat generálni egyenletes eloszlással?
2018. okt. 28. 17:20
 9/12 anonim ***** válasza:

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)

2018. okt. 28. 17:54
Hasznos számodra ez a válasz?
 10/12 A kérdező kommentje:

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?

2018. okt. 28. 18:16
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!