Adasz001 Opublikowano 25 Stycznia 2005 Zgłoś Opublikowano 25 Stycznia 2005 Witam! Dopiero rozpoczynam swoją przygodę z C i mam pytanie: Jak przypisać zmiennej wartość losową z jakiegoś przedziału, np. 0-100, czy 0-20. Próbowałem takich konstrukcji: double x, y; x = (double) rand()/ (RAND_MAX + 1.0) ); y = 10*x; int x, y; x = rand(); y = x % 10; int x, y; x = rand(); srand(x); x = rand(); srand(2*x); y = x % 10; Niestety, we wszystkich powyższych przypadkach wciąż generuje się ta sama liczba (również po restarcie), odpowiednio: w 1 – 0, w 2 – 6, a w 3 – 7. Generowałem również liczbę pseudolosową z zegara systemowego w taki sposób: struct tm *czas_p, czas; int x; czas_p = &czas; time(czas_p); x = czas_p->tm_sec % 10; Owszem, liczba przy każdym uruchomieniu programu była inna, ale dla moich potrzeb komputer musi kilkakrotnie losować różne liczby, jeśli staram się to zrobić, to komputer we wszystkich miejscach wyświetla tą samą liczbę. Jeśli ktoś mógłby to proszę o jakiś kod wraz z objaśnieniem. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ayem Opublikowano 25 Stycznia 2005 Zgłoś Opublikowano 25 Stycznia 2005 srand((unsigned)time(NULL));for (int i=0;i<3;i++){ wynik[i] = losuj();} int gra::losuj(int od=0, int _do=6){ int zakres = _do - od + 1; return od + int(zakres * rand()/(RAND_MAX + 1.0));} to dziala - tylko zakres musisz sobie ustawic. (zeby losowanie bylo faktycznie w miare losowe musisz uzyc srand(); Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Adasz001 Opublikowano 25 Stycznia 2005 Zgłoś Opublikowano 25 Stycznia 2005 @Ayem: dzięki za odpowiedź, ale przepisałem Twój kod i niestety kompilator wyświetlał mi masę błędów - błędy składni, niezdefiniowane symbole, itp. a kiedy cos pozmienialem i juz to się "podobało" kompilatorowi to zaraz wymyślał nowy błąd... :sad: może wyślij mi cały kod jakiegoś drobnego programu z wykorzystaniem tej funkcji, np. taki ktory by wyswietlal 1 wynik losowania, a byłbym bardzo wdzięczny. btw. gdyby to miało coś do rzeczy to używam Turbo C kompilatora Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ayem Opublikowano 25 Stycznia 2005 Zgłoś Opublikowano 25 Stycznia 2005 hmm ty piszesz w c a ja w c++ ;) ale cos pokombinuje #include <stdio.h>#include <stdlib.h>#include <time.h>int main(){ int losowa_zmienna; srand((unsigned)time(NULL)); for (int i=0;i<10;i++) { losowa_zmienna = rand(); printf("losowanie %d, wynik: %d\n",i,losowa_zmienna); } return 0;} jakos tak powinno dzialac - tamto poprzednie mozesz wykorzystac do okreslenia zakresu z ktorego ma losowac (u mnie bylo to 0-2). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mathias79 Opublikowano 25 Stycznia 2005 Zgłoś Opublikowano 25 Stycznia 2005 zamiast srand możesz również użyć randomize() ... ja zawsze losuje liczby w taki oto sposób: int losuj(int zakres){zakres++;int liczba;liczba = rand()%zakres;return liczba;}funkcja ta zwroci ci liczbe od 1 do "zakres". jeśli nie byłoby linii inkremetujuącej zakres to wynikeim funkcji będzie liczba od 0 do "zakres-1". Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
spicum Opublikowano 25 Stycznia 2005 Zgłoś Opublikowano 25 Stycznia 2005 wrzuć sobie man rand, a przekonasz sią, że preferowaną metodą jest jednak max*rand()/(RAND_MAX + 1.0) wyjaśnienia są w man'ie. :wink: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ayem Opublikowano 26 Stycznia 2005 Zgłoś Opublikowano 26 Stycznia 2005 to bylo w mmojej pierwszej propozycji nie chcialo mi sie przepisywac - sluzy do ustalenie z jakiego zakresu ma losowac. ten drugi program to mialabyc tak a czysta lopata pokazujaca zasadze dzialania Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
spicum Opublikowano 26 Stycznia 2005 Zgłoś Opublikowano 26 Stycznia 2005 ayem: wiem ze pisales preferowana wersje ;) pilem do postu skrobnietego przez mathias79 :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ayem Opublikowano 26 Stycznia 2005 Zgłoś Opublikowano 26 Stycznia 2005 ayem: wiem ze pisales preferowana wersje ;) pilem do postu skrobnietego przez mathias79 :) 1236911[/snapback] hmm musze sie nauczyc ze najpierw sie budzi a potem odpisuje :| sorrki - w ogole nie zauwazylem jego posta :| Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Adasz001 Opublikowano 27 Stycznia 2005 Zgłoś Opublikowano 27 Stycznia 2005 Dziękuję wszystkim za odpowiedzi - teraz juz wszystko ładnie działa :) , btw. zakres zrobiłem tak: x = rand(); x = x%100; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mathias79 Opublikowano 27 Stycznia 2005 Zgłoś Opublikowano 27 Stycznia 2005 (edytowane) wrzuć sobie man rand, a przekonasz sią, że preferowaną metodą jest jednak max*rand()/(RAND_MAX + 1.0)wyjaśnienia są w man'ie. :wink: 1236378[/snapback] widzisz .... w borland builderze przykład jest następujący : #include <stdlib.h>#include <stdio.h>int main(void){ int i; randomize(); printf("Ten random numbers from 0 to 99\n\n"); for(i=0; i<10; i++) printf("%d\n", rand() % 100); return 0;}ale poszukam w manie co tam może być napisane Edytowane 27 Stycznia 2005 przez mathias79 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
spicum Opublikowano 27 Stycznia 2005 Zgłoś Opublikowano 27 Stycznia 2005 NAZWA rand, srand - generator liczb losowych.SKŁADNIA #include <stdlib.h> int rand(void); void srand(unsigned int seed);OPIS Funkcja rand() zwraca pseudolosową liczbę całkowitą z zakresu pomiędzy 0 a RAND_MAX. Funkcja srand() ustawia swój argument jako wartość początkową dla nowego ciągu pseudolosowych liczb całkowitych zwracanych przez rand(). Ciągi te są powtarzalne poprzez wywołanie srand() z tą samą wartością początkową. Jeśli nie podano wartości początkowej, funkcja rand() automatycznie ustawia tę wartość na 1.WARTOŚĆ ZWRACANA Funkcja rand() zwraca wartość z zakresu pomiędzy 0 a RAND_MAX. Funkcja srand() nie zwraca żadnej wartości.UWAGI Wersje rand() i srand() w bibliotece C Linuksa korzystają z tego samego generatora liczb losowych, co random() i srandom(), więc mniej znaczące bity powinny być tak samo losowe jak bity bardziej znaczące. Jednakże, w starszych implementacjach rand() bity mniej znaczące są znacznie mniej losowe niż bity bardziej znaczące. W Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetter- ling; New York: Cambridge University Press, 1992 (wyd. 2, str. 277)), umieszczono następujące komentarze: "Jeśli chcesz wygenerować liczbę losową spomiędzy 1 a 10, powinieneś zawsze robić to korzystając z bardziej znaczących bitów, jak w j=1+(int) (10.0*rand()/(RAND_MAX+1.0)); a nigdy z czegoś podobnego do j=1+(rand() % 10); (co korzysta z mniej znaczących bitów)." Generacja liczb losowych jest złożonym zagadnieniem. Książka Numerical Recipes in C (patrz referencje powyżej) zawiera doskonałą dyskusję praktycznych wyników generacji liczb losowych w rozdziale 7 (Random Numbers). Bardziej teoretyczną dyskusję, która również szeroko omawia wiele praktycznych wyników można znaleźć w rozdziale 3 (Random Numbers) Donalda E. Knutha The Art of Computer Programming, tom 2 (Seminumerical Algorithms), wyd. 2; Reading, Massachusetts: Addison-Wesley Publishing Company, 1981.ZGODNE Z SVID 3, BSD 4.3, ISO 9899ZOBACZ TAKŻE random(3), srandom(3), initstate(3), setstate(3) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ayem Opublikowano 27 Stycznia 2005 Zgłoś Opublikowano 27 Stycznia 2005 w visualu randomize() mi nie dzialalo stad srand Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...