zmiana na losowe

mida
Użytkownik
Użytkownik
Posty: 21
Rejestracja: 18 lis 2007, o 11:27
Płeć: Kobieta
Lokalizacja: Warszawa
Podziękował: 1 raz

zmiana na losowe

Post autor: mida »

mam wielka prośbę.
mógłby ktoś wprowadzić takie zmiany do tego programu aby losował on sam np 20 liczb a nie prosił o ich wpisanie.

Z góry dziękuję



#include
#include
using namespace std;

void inicjuj(int *A, int n)
{
for ( int i=0; i
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

zmiana na losowe

Post autor: kadiii »

Kod: Zaznacz cały

void inicjuj(int *A, int n, int min, int max)
{
srand(time(0));
 for ( int i=0; i<n; i++)
 {
 A[i]=(int)(rand()/(RAND_MAX+1.0)*(max+abs(min)))+min;
 //lub prościej, ale nieco gorzej A[i]=rand()%(abs(min)+max)+min;
 }
} 
A w programie głównym dodaj nagłówki time.h dla funkcji time oraz math.h dla funkcji abs.
Nie zapomnij też o pobraniu zakresu losowania do dwóch intów i wywołaniu funkcji inicjuj(A,n,min,max). Pozdrawiam
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

zmiana na losowe

Post autor: Rafal88K »

Jeśli ma to być w C++ a tak sądzę po

Kod: Zaznacz cały

#include <iostream>
to powinno być ctime i cmath (choć to tutaj nie potrzebne) to takie szczegóły
kadiii pisze: A=(int)(rand()/(RAND_MAX+1.0)*(max+abs(min)))+min;
//lub prościej, ale nieco gorzej A=rand()%(abs(min)+max)+min;

Lub jeszcze prościej:

Kod: Zaznacz cały

// Losuje liczbę z przedziału od nMin do nMax
inline int random(int nMin, int nMax)
{
    return rand() % (nMax - nMin + 1) + nMin;
}
i przed użyciem dodaj:

Kod: Zaznacz cały

srand(static_cast<unsigned int>(time(NULL)));


kadiii pisze:inicjuj
Nie wiem co ta nazwa funkcji ma do tego co ona robi to powinno się nazywać przypisz
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

zmiana na losowe

Post autor: kadiii »

O widzę, że w każdym temacie próbujesz podać swoje "lepsze rozwiązania". Co do Inicjacji i inicjalizacji - po pierwsze to nie ja pierwszy nazwałem tak tę funkcję(zobacz pierwszy post), po drugie tych słów używa się czasem zamiennie - nawet w linku, który podałeś
2. �zapoczątkowanie lub rozpoczęcie się czegoś�
(to właśnie to znaczenie.

Kod: Zaznacz cały

 A[i]=(int)(rand()/(RAND_MAX+1.0)*(max-min)+min;
Ten sosób korzysta ze skalowania. Ma on tą przewagę, że w windowsie jeżeli użyjesz

Kod: Zaznacz cały

return rand() % (nMax - nMin + 1) + nMin; 
to jeżeli nMax-nMin będzie większe od 32tys. z "groszami" to wyniki będą już niepoprawne.bo RAND_MAX ma w tym systemie właśnie taką wartość-ok32tys. Ogólnie to standardowe funkcje losujące są czasem mocno nieużyteczne- jak chcemy tylko wypełnić tablicę to starczają, ale jak ma to jakiś wymiar powiedzmy symulacyjny warto napisać własną funkcję losującą. Pozdrawiam
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

zmiana na losowe

Post autor: Rafal88K »

Wartość RAND_MAX jest zależna ale minimalnie wynosi 32767 i w tym wypadku był to najlepsze i najszybsze rozwiązanie
kadiii pisze:(to właśnie to znaczenie.
Inicjalizacja to nadanie wartości początkowej, a w tym przypadku przypisujesz wartość, a nie nadajesz wartość początkową. Więc to nie jest to znaczenie.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

zmiana na losowe

Post autor: kadiii »

Wartość RAND_MAX jest zależne ale minimalnie wynosi 32767 i w tym wypadku był to najlepsze i najszybsze rozwiązanie
Minimalna i dla Windowsa maksymalna, czyli jeśli byśmy chceli losować właśnie takie liczby to już mówiłem, że byłaby lipa a w końcu w zadaniu nie było podane jakie liczby mamy losować, więc czemu mamy ograniczać. Ale to chyba znowu drobnostka, której nie warto się czepiać. Ba, o jakiej szybkości my mówimy przy losowaniu 20 liczb . Co do słowa innicjalizacji(czy inicjacji) - przecież to właśnie robi funkcja, nadaje wartości pustej(często wyzerowanej) tablicy. Zgoda, że wywołanie tej funkcji ponownie na tej tablicy byłoby już przypisaniem. Jednakże z treści zadania jak i z użycia funkcji w programie jednoznacznie wynika, że chodzi nam właśnie o inicjalizaję.
Nazwa funkcji inicjuj(czy inicjalizuj) jest jak najbardziej jasna, czytelna i adekwatna do jej użycia(zaproponowana przez ciebie nazwa przypisz byłaby raczej nieczytelna).
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

zmiana na losowe

Post autor: Rafal88K »

Inicjalizacja jest to nadanie wartości obiektowi w momencie jego tworzenia, a w tym przypadku tablicę mamy już stworzoną.
kadiii pisze:przecież to właśnie robi funkcja
Ta funkcja przypisuje wartości do istniejących już elementów tablicy. Więc nazwa nie jest adekwatna do jej użycia
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

zmiana na losowe

Post autor: kadiii »

Nie zgodzę się bo chociaż z formalnego punktu widzenia nie wykonujesz inicjalizacji w kodzie to jednak na płaszczyźnie algorytmu takowej dokonujesz. Zauważ, że chcemy mieć na wstępie ciąg losowy w tablicy czyli funkcja tworzy ciag losowy(inicjuje ciąg losowy). To, że w kodzie tak naprawdę jest to przypisanie nie ma żadnego znaczenia. To kwestia wyczucia nazywania funkcji zgodnie z ich użyciem. Inicjalizacja występuje na płaszczyźnie algorytmu czyli właśnie na tej, na której odbiera się strukturę programu.
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

zmiana na losowe

Post autor: Rafal88K »

Inicjalizacja:
int a = 6;

Przypisanie:
a = 7;

Tak jest między nimi różnica, a w tym przypadku widać, że funkcja nic nie inicjalizuje.

Ciekawe mamy tematy do kłótni, jak nazywanie funkcji
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

zmiana na losowe

Post autor: kadiii »

Jak mówi tytuł programu pana Pospieszalskiego "Warto rozmawiać"- może kłócić się też jest czasem warto, w końcu to też wymiana myśli . Co do tej inicjalizacji to tak jak pisałem na poziomie algorytmicznym inicjalizujesz. Może ciężko sobie to wyobrazić bo to mniej zunifikowana płaszczyzna. Ale spróbuj zrozumieć. Jak masz na wstępie jakiś element z wartością początkową( w tym wypadku ciąg losowy) to w programie inicjalizujesz(mówiąć kolokwialnie wypełniasz) tę tablicę. I nie ma znaczenia jak definiujesz inicjalizację w informatyce. Dla przykładu: funkcję, która byłaby taka:
int NAZWA(int x)
{
return x
ODPOWIEDZ