losowanie liczb 0-9

0
srand(time(0));
			zmienna=rand()%10;

Czy to losowanie na pewno jest dobrze napisane? Bo często zdarza mi się tak, że 2 razy jest ta sama liczba, ba a nawet bardzo często. Przykładowo wylosowana została 5 potem znowu 5 potem 3 potem znowu 3.

0

Zależy od tego ile razy inicjalizujesz ziarno.

0

Co znaczy bardzo często? Bo jeśli patrzysz powiedzmy na ciąg 4 cyfr to prawdopodobieństwo, że obok siebie będą jednakowe cyfry wynosi 0.271.
Dla 10 cyfr te prawdopodobieństwo wynosi już ~0.613

0

Jeżeli losujesz dokładnie tak jak podałeś czyli:

                        srand(time(0));
                        zmienna=rand()%10;

To nić dziwnego że tak się dzieje.
Inicjalizujesz ziarno za pomocą time(0) którego wartość zmienia się tylko raz na sekundę18 razy na sekundę (na niektórych komputerach inaczej)
Więc każde losowanie w ciągu najbliższej najbliższych 1/18 (po zmianie) sekundy daje ten sam wynik.
srand(time(0));
powinieneś dać tylko raz na początku programu.

0

Akurat time(0) zmienia się raz na sekundę, a nie 18 razy na sekundę.

NAME
       time - get time in seconds

SYNOPSIS
       #include <time.h>

       time_t time(time_t *t);

DESCRIPTION
       time() returns the time as the number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).

       If t is non-NULL, the return value is also stored in the memory pointed to by t.

RETURN VALUE
       On success, the value of time in seconds since the Epoch is returned.  On error, ((time_t) -1) is returned, and errno is set appropriately.

 

Na Uniksach / Linuksach wewnętrzny czas systemowy też nie zmienia się 18 razy na sekundę, tylko zależnie od konfiguracji jądra, typowo 250 razy na sekundę lub 1000 razy na sekundę. 18 razy na sekundę to chyba tylko w DOSie i Windows.

Na Uniksach dokładniejszy czas dostaniesz używając następujących funkcji:

#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv, const struct timezone *tz);
0

Kawałek kodu:

do
{
	traf=0;
	srand(time(0));
	zmienna=rand()%10;
	printf("\nJaka liczbe wylosowal komputer?: ");		
	do
	{
		scanf("%d", &liczba);
		//dalsze instrukcje

	}
}
while(wybor2==1);

Przykładowo odpalam program i pyta mnie o wylosowaną przez komputer liczbę, więc ja wpisuję ileś tam aż trafię. Jeśli w końcu trafię to pyta mnie czy chce dalej grać, następnie wybieram, że chcę i w tym właśnie momencie kiedy znowu trafię wylosowaną liczbę okazuje się, że jest ona taka sama jak poprzednia.
Przykład:
We: 5, 7, 9 Wy:9
We: 5, 6, 7, 9 Wy:9
We: 5, 2 Wy:2
We: 5, 1, 2 Wy:2
We: 5 Wy:5
We: 5, 1 Wy:1
We:5, 4, 2, 1 Wy:1

Myślę, że będziecie wiedzieli o co chodzi xD A chodzi o to, że zazwyczaj 2 oboksiebie kolejki zawierają tę samą wylosowaną liczbę (Tak jest w 75%). Czyli np. na 10 kolejek 4 są takie same i 2 inne co daje łącznie 10 (4+4+2 dla rozjaśnienia)

0

Przenieś wywołanie srand przed pętlę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1