Pseudolosowanie liczb źle działa, jeśli jest w osobnej funkcji.

0

Cześć, zacząłem robić zadanie z Cpp0x i już na samym początku mam pewien problem. Gdy w funkcji main mam

 srand(time(NULL));
int irandomNmbr=(rand() % 1001) +0;
cout<<irandomNmbr;

to wszystko jest ok, zawsze jest inna liczba.
Ale gdy mam to w funkcji:

void randomNmbr()
{
srand(time(NULL));
int irandomNmbr=(rand() % 1001) +0;
} 

I w funkcji głównej mam:

int main()
{
    cout<<"Program wylosuje jedna liczbe calkowita z przedzialu 0-1000. Sprobuj ja zgadnac:";
    randomNmbr();
    cout<<irandomNmbr;
    return 0;

} 

To program ZAWSZE losuje tę samą liczbę. Dlaczego tak się dzieje?

3

irandomNmbr to zmienna globalna?

int irandomNmbr=(rand() % 1001) +0;

w tym miejscu przypisujesz coś do zmiennej lokalnej i dalej nic z nią nie robisz. nie ma to żadnego wpływu na zmienna globalną irandomNmbr.
zmienianie ziarna za pomocą funkcji srand za każdym razem gdy chcemy wygenerować liczbę nie ma sensu.

0

Przecież ta funkcja ma zwracać tę wylosowaną liczbę. W dodatku srand wywołuje się raz podczas startu programu.

A tak w ogóle to rand nie powinno się używać. Użyj <random> z biblioteki standardowej C++.

0

@ly000
Ale przecież funkcja srand jest tutaj użyta tylko raz.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int inputNmbr;
int irandomNmbr;

void randomNmbr()
{
srand(time(NULL));
int irandomNmbr=(rand() % 1001) +0;
}

void optionNmbr()
{
    if (inputNmbr==irandomNmbr)
        cout<<"Gratulacje. Zgadles!";
}

int main()
{
    cout<<"Program wylosuje jedna liczbe calkowita z przedzialu 0-1000. Sprobuj ja zgadnac:";
    randomNmbr();
    cout<<irandomNmbr;
    return 0;
}
 
2

Zacznij od tego:

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int randomNumber()
{
    return (rand() % 1001) +0;
}

int main()
{
    srand(time(NULL));

    cout << "Program (w przyszlosci) wylosuje jedna liczbe calkowita z przedzialu 0-1000. Sprobuj ja zgadnac:";
    cout << randomNumber();
}
  1. Nie używaj zmiennych globalnych jeżeli nie ma to sensu.
  2. srand ma być wywołane raz.
  3. Nie nazywaj rzeczy "nmbr". Po to masz wielki monitor, żeby zmieściło się na nim randomNumber.
  4. Nie ucz się staroci, ucz się <random>.
1

najważniejszy problem jest to, że tworzysz zmienną lokalną, która zasłania zmienną globalną.
Efekt jest taki, że zmienna globalna nigdy nie jest modyfikowana.
Zresztą kompilator cię o tym ostrzega: http://melpon.org/wandbox/permlink/8bpcAp9DUa2he4Fi

prog.cc5: warning: unused variable 'irandomNmbr' [-Wunused-variable]
int irandomNmbr=(rand() % 1001) +0;

Tą odpowiedź dostałeś na samym początku od @ly000 ale najwyraźniej ją zignorowałeś.

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