[c++] rand - losowanie liczby z małego zakresu

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…

To może coś prostszego:

srand(time(NULL));

wylosowana=rand() % 6;

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

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;

}

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;

}