Losowanie liczb

0

Witam, jak to zwykle bywa chciałbym się poradzić bardziej doświadczonych użytkowników forum na temat mojego programu który wygląda następująco:

#include <cstdlib>
#include <iostream>
#include <ctime>
#include <conio.h>

using namespace std;
int Losowanie(int *wsk, int max, int rozmiar);
int Wpis_do_tab(int *wks, int rozmiar);
int main()
{
    int tablica_los[10], tablica_uzy[10];
    int max = 10, rozmiar = 10;
    char licznik;
    do
    {
        for(int i = 0; i < rozmiar; i++)
        {
            tablica_los[i] = Losowanie(tablica_los, max, rozmiar);
        }
        cout << "Tablica wylosowana to: \n" << endl;
        for(int i = 0; i < rozmiar; i++)
        {
            cout << "\tTablica_los[" << i <<"] = " << tablica_los[i] << endl;
        }
        cout << "\nProsze o podanie 10 elementow tablicy\n" << endl;
        Wpis_do_tab(tablica_uzy, rozmiar);
        cout << "\n\nPowtorzyc operacje? t/n";
        cin >> licznik;
    }
    while(licznik != 'n');  
}
int Losowanie(int *wsk, int max, int rozmiar)
{
        srand(time(NULL));
        *wsk = rand()%max;
        return *wsk;
}
int Wpis_do_tab(int *wsk, int rozmiar)
{
    for(int i = 0; i < rozmiar; i++, *(wsk++))
    {
        cout << "\tTablica[" << i <<"] = ";
        while(!(cin >> *wsk))
        {
            cin.clear(); //kasowanie flagi błędu strumienia
            cin.sync(); //kasowanie zbędnych znaków z bufora
        }
    }
} 

Program jaki jest każdy widzi, ale moje pytanie brzmi, czy losowanie liczb może odbywać się w sposób "losowy"? To co mam teraz to powtarzanie kolejnego wyniku, nie rozumiem dlaczego funkcja chodź jest wywoływana w pętli, czyli powinna podawać nowe liczby, bo funkcja jest uruchamiana kilka razy od nowa prawda? Natomiast efektem jest podawanie ciągle tej samej cyfry, próbowałem też zrobić pętle for w funkcji "Losowanie" ale to także dało wymierne efekty, może ktoś mógłby podpowiedzieć jak się z tym uporać?

Losowanie nie musi być doskonałe, przeważnie będzie odbywać się w zbiorze 10-cio elementowym, chodź chciałbym dać możliwość podawania zakresu przez użytkownika, zostawiłem sobie taką furteczkę :P

Wpadłem też na pomysł żeby losować odpowiednie komórki pamięci, odczytywać je i zaokrąglać do jedności, po czym zapisywać do tablicy, co o tym sądzicie?

1

Odpowiedź, że instrukcja

srand(time(NULL));

powinna być użyta w programie tylko raz, widziałem już ze sto razy.

0

Generator liczb losowych ogólnie działa na zasadzie, że ma jakiś tam stan i przy kolejnych wywołaniach dostajesz liczby wynikające z jakieś funkcji na tym stanie oraz następuje zmiana stanu po każdej pobranej liczbie. Funkcja srand służy ustawieniu stanu początkowego (seeda) domyślnego generatora liczb losowych. W twoim przypadku między kolejnymi wywołaniami funkcji Losowanie jest mniej niż 1 sekunda, więc generator jest inicjalizowany do tego samego stanu. TL:DR wyrzuć srand poza pętle.

0

Ziarno ustala się RAZ na wykonanie programu!!!

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