Witam. Chciałbym wylosować do tablicy 20 liczb z zakresu 10-20. Trzeba skorzystać z funkcji rand i modulo. Może mi ktoś wytłumaczyć o co chodzi z tym modulo bo nie mogę tego zrozumieć.
Przykładowo potrzebujemy liczby losowej z przedziału od 1 do 10. Użyjemy do tego operatora binarnego modulo (%). Służy on do obliczenia reszty z dzielenia liczb całkowitych. Na przykład:
cout<<5%3;
O to ci chodzi ?
#include
...
srand(time(NULL)); //jako podstawę bierzemy czas systemowy
for (int i=0; i<20; i++) {
T[i]=(rand%10)+11;
}
Nie testowałem ale chyba powinno działać
Jeśli chodzi o istotę to działania modulo to:
*zwraca liczbę która jest resztą z dzielenia liczy a przez b ( to już ktoś tłumaczył)
* jak zastosować to trzeba widzieć, że rand daje pseudo losową liczbę z zakresu od 0 do 1;
*czyli musimy musimy uzyskaną liczę pomnożyć przez 100, da to nam liczby z zakresu od 0 do 100;
*następnie z wygenerowanych liczb wybieramy tylko te z zakresu nam potrzebnego np w pętli z if
@up: chyba nie mówisz o tym randzie ze standardowej biblioteki. rand zwraca liczby od 0 do RAND_MAX.
siabaniak , funkcja rand() zwraca liczbę z zakresu od 0 do RAND_MAX.
Jeżeli koniecznie chcesz skorzystać z moduł to: rand()%11+10;
Ale to nie jest dobry pomysł, zastanów się nad: (int)(11*rand()/(RAND_MAX+1.))+10
Jeśli RAND_MAX jest zdefiniowany jako więcej niż std::numeric_limits::max()/11, to wynik będzie niepoprawny. Modulo coprawda nie daje gwarancji równomiernego rozkładu, ale przy niskich przedziałach (i tylko wtedy) jest to błąd pomijalny i rozwiązanie IMO bezpieczniejsze. (z drugiej strony zawsze można zacząć od rzutowania na np. long long int…)
Nie rozumiem co masz na myśli. Co ma do rzeczy sposób definicji RAND_MAX?
Jeśli RAND_MAX == std::numeric_limits::max(), to 11*rand() może przekroczyć zakres zmiennej. To doprowadzi do błędów w wyniku podanego wyrażenia (m.in. przez to, że int jest zmienną ze znakiem). rand() ma gwarantowany minimalny zakres (1 do 32k o ile dobrze pamiętam), ale standard nie definiuje zakresu maksymalnego (czyli nic nie stoi na przeszkodzie, by losowane wartości były w okolicach int max).
(int)(11.*rand()/(RAND_MAX+1.))+10[/code]
- może być ?
int tab[100];
for(int i = 0;i < 100;++i)
tab_= rand()%21+30;_
Ten kod losuje sto liczb z przedziału 30 -50, dlaczego jest modulo 21+30, tego nie rozumiem
– Dodane 28.09.2009 (Pn) 6:42 –
Nie wiem co trzeba podzielić przez co lub pomnożyć czy dodać to jakaś czarna magia
Dziedziną funkcji %21 jest zbiór liczb całkowitych <0,20>, jak dodasz do takiego zbioru 30, to ‘przesuniesz’ go w taki sposób by dawał wyniki z przedziału <30, 50>
Błąd, jedno z dwóch:
- [*:2ped4vf2]Dziedziną funkcji y=x% 21 jest zbiór liczb całkowitych <0,20>
Oczywiście, źle przepisałem z cytatu. Dzięki za zwrócenie uwagi.
Wielkie dzięki teraz rozumiem