Rand w c++


(natan007) #1

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


(N3t B0y) #2

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 ? :stuck_out_tongue:


(Kukicola) #3
#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ć


(Siabaniak) #4

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


(Fiołek) #5

@up: chyba nie mówisz o tym randzie ze standardowej biblioteki. rand zwraca liczby od 0 do RAND_MAX.


([alex]) #6

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


(Ryan) #7

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


([alex]) #8

Nie rozumiem co masz na myśli. Co ma do rzeczy sposób definicji RAND_MAX?


(Ryan) #9

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


([alex]) #10
(int)(11.*rand()/(RAND_MAX+1.))+10[/code]
  • może być ? :stuck_out_tongue:

(natan007) #11

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


(Airborn) #12

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>


([alex]) #13

Błąd, jedno z dwóch:
- [*:2ped4vf2]Dziedziną funkcji y=x% 21 jest zbiór liczb całkowitych <0,20>


(Airborn) #14

Oczywiście, źle przepisałem z cytatu. Dzięki za zwrócenie uwagi.


(natan007) #15

Wielkie dzięki teraz rozumiem