yooko 0 Napisano 7 Czerwca 2017 Udostępnij Napisano 7 Czerwca 2017 Witam mam problem z kawałkiem kodu cl=3; srand (8); for (zv = 0; zv < 4; ++zv) printf ("%d , ", rand ()); //losuje liczby 64, 28170, 311, 31103, for (zv = 0; zv < cl - 1; ++zv){ printf("\nkh%d cl=%d zv=%d", 2 * zv + -4 * cl,cl,zv); rk = zv+rand() % (cl-zv); printf("\ncj%d cl=%d zv=%d rk=%d", 3 * rk + 1 * zv,cl,zv,rk); nie chodzi mi o to co printf wyswietla tylko czemu rk przyjmuje wartosc 2? Z góry dzieki za pomoc Cytuj Link to post Share on other sites
walker 3324 Napisano 7 Czerwca 2017 Udostępnij Napisano 7 Czerwca 2017 Bo akurat takie liczby wypluwa rand seedowany ósemką. Zmień seed, lub zmień pozycję w ciągu randu (np więcej pętli w pierwszym forze) i rk mogą być inne. Ciąg z rand po 8: 64, 28170, 311, 31103, 25835, 10443, 497,... Pierwsze cztery wartości zjadłeś jednym forem, więc drugi for liczy kolejno: 1. rk=0+25835%(3-0) 2. rk=1+10443%(3-1) W obu przypadkach wynik to dwa. 1 Cytuj Link to post Share on other sites
yooko 0 Napisano 7 Czerwca 2017 Autor Udostępnij Napisano 7 Czerwca 2017 no tak ale jak, wylosuje tylko jedna liczbe i bedzie to 64 to nie pokarze mi rk=1 tylko rk=0 bo obliczby reszte z dzielnia przez 3 nie z 64 tylko z 28170. I na jakiej zasadzie srand(8) losuje liczby ? Cytuj Link to post Share on other sites
walker 3324 Napisano 7 Czerwca 2017 Udostępnij Napisano 7 Czerwca 2017 srand ustawia seed dla rand. O 'losowaniu' liczb tutaj nie ma co mówić - ciąg jest ustalony, zawsze będą takie same. To nie są losowe liczby 1 Cytuj Link to post Share on other sites
yooko 0 Napisano 7 Czerwca 2017 Autor Udostępnij Napisano 7 Czerwca 2017 Wyczytałem w internecie że srand(x) to liczy iczby tak : y1=(x+b)%n y2=(y1*x+b)%n itd y wylosowana liczba b i n to sa stałe komputera da sie je jakos obliczbyc ? Cytuj Link to post Share on other sites
walker 3324 Napisano 8 Czerwca 2017 Udostępnij Napisano 8 Czerwca 2017 Tyle i tylko tyle: void srand(unsigned int seed) { holdrand = (long) seed; } int rand() { return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); } A jeśli funkcja ci się nie podoba, to możesz ją śledzić krok po kroku: #include <stdio.h> #include <stdlib.h> static long int ziarno; void starter(unsigned int liczba) { ziarno = (long) liczba; } int nowyrand() { long int a,b,c,d; a=ziarno * 214013L; b=a + 2531011L; ziarno=b; c=b >> 16; d=c & 0x7fff; return d; } int main() { int i; starter(8); for(i=0;i<10;i++) { if((i)&&(!(i%5)))printf("\n"); printf("%5.d, ",nowyrand()); } return 0; } 1 Cytuj Link to post Share on other sites
Recommended Posts
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.