Skocz do zawartości
Adasz001

Losowe Zmienne W C

Rekomendowane odpowiedzi

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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();

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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".

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez mathias79

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...