spwmarluk
(Spwmarluk)
30 Lipiec 2009 14:47
#1
Witam,
Mam problem z wylosowaniem dwóch różnych liczb z zakresu od 0 do 5.
#include
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
int t1, t2;
int t_max=5;
t1=(int)((double)t_max*(rand()/RAND_MAX));
do
t2=(int)((double)t_max*(rand()/RAND_MAX));
while(t1==t2);
cout << t1 << " " << t2 << endl;
return 0;
}
Po pierwsze losowanie trwa bardzo długo, po drugie zawsze dostaję liczby 0 i 5.
Nie wiem już co poprawić, a użycie rand() jest przepisane niemal żywcem z manuala…
kutar
(Kutar 0)
30 Lipiec 2009 16:19
#2
To może coś prostszego:
srand(time(NULL));
wylosowana=rand() % 6;
_alex
([alex])
30 Lipiec 2009 22:00
#3
rand()/RAND_MAX - jeżeli wylosowana liczba mniejsza niż RAND_MAX to wynikiem jest 0, jeżeli równa RAND_MAX to wynikiem jest 1
użyj:
(int)(t_max*((double)rand()/(RAND_MAX+1))); [/code]
lub
code=php (t_max*(rand()/(RAND_MAX+1.)));
kortyg
(Sned)
31 Lipiec 2009 07:22
#4
Można na wiele sposobów. Ponieważ losujesz tylko 2 liczby podam prosty przykład. Przy losowaniu np 20 liczb z 30, podany przykład jest nieefektywny.
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
int t1, t2;
int t_max=6;
while(1)
{
t1=rand()%t_max;
t2=rand()%t_max;
if(t1!=t2)break;
}
cout << t1 << " " << t2 << endl;
getch();
return 0;
}
spwmarluk
(Spwmarluk)
31 Lipiec 2009 08:16
#5
Wiem, że prościej, ale w manualu tego nie zalecają. Aczkolwiek działa poprawnie. [alex] - dzięki, działa ale musiałem dodać do t_max+1, ponieważ nie mogłem nigdy otrzymać z losowania t_max. kortyg - Twoje rozwiązanie bazuje na tym podanym przez użytkownika kutar, czy jest ono nieefektywne na dłuższą metę z powodów podanych w manualu? (… you should always use high-order bits, as in
j = 1+ (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
and never by anything resembling
j = 1 + (rand() % 10 );
which uses lower-order bits) Dzięki za pomoc. Przyjąłem rozwiązanie:
#include
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
int t1, t2;
int t_max=5;
t1=(int)((t_max+1)*(rand()/(RAND_MAX+1.0)));
do
t2=(int)((t_max+1)*(rand()/(RAND_MAX+1.0)));
while(t1==t2);
cout << t1 << " " << t2 << endl;
return 0;
}