Pseudolosowanie

0

Cześć
Napisałem coś takiego (z poradnikiem/kursem):

 #include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    srand( time( NULL ) );
    std::cout << "Wylosowanie pierwsze: " <<(( rand() % 50 ) + 7 ) << std::endl;
    int liczba =( rand() % 50 ) + 7;
    std::cout << "Wylosowanie drugie: " << liczba << std::endl;
    liczba =( rand() % 50 ) + 7;
    std::cout << "Wylosowanie trzecie: " << liczba << std::endl;
    return 0;
}
  1. Czy można każde losowanie zapisać tak jak pierwsze, czyli bez ustalania zmiennej "liczba"?
( rand() % 50 ) + 7; 

tutaj rodzi się kolejne pytanie, gdyż poradnik z którego korzystam mówi, że liczba 50 w tym przykładzie to zakres losowanych liczb a 7 to liczba porządkowa. Bez tego opisu zapis ten rozumiał bym jako "wylosowaną liczbę podziel przez 50, a następnie dodaj 7. Co jest nie tak w moim rozumowaniu?
Program oczywiście działa ale nie chciał bym zostawać z tą wiedzą "bo tak jest" wole wiedzieć czemu tak jest.

0
  1. tak
  2. Chodzi tu o wylosowanie liczby od 0 do 49, i dodanie do niej 7 czyli wynik będzie od 7 do 56
0
sig napisał(a):
  1. tak
  2. Chodzi tu o wylosowanie liczby od 0 do 49, i dodanie do niej 7 czyli wynik będzie od 7 do 56

Ale czemu to jest definiowane jako zakres od 0 do 49 a nie dzielenie i czemu to jest +7 (dodawanie) a nie tak jak mówi poradnik, że ta np. 7 to liczba początkowa.

0

przegapiłeś coś % to nie dzielenie tylko reszta z dzielenia

0
szopenfx napisał(a):

przegapiłeś coś % to nie dzielenie tylko reszta z dzielenia

Czyli ta linijka mówi, że w zmiennej liczba zapisze się liczba podzielona przez 50 +7 i to ta liczba jest podana jako losowa? To jak mi to ustala zakres od zera do 49?
@Edit: Widzę, że to już drugi poradnik który nic nie tłumaczy tylko pokazuje jak wykonać jakieś założenia/zadania.
Możecie mi polecić jakiś dobry poradnik lub książkę? Ostatnio dostałem "Microsoft Visual C++ 2008. Praktyczne przykłady" słyszałem, że symfonia też jest dobra, choć patrząc na jej cenę wolał bym coś w wersji elektronicznej.

0

eh...
dajmy na to, że losowane są liczby z dużego zakresu oto kilka z nich:
5554123 dzielone przez 50 da 111082 całości i 23 reszty
241 dzielone przez 50 da 4 całości i 41 reszty
74348 dzielone przez 50 da 1486 całości i 48 reszty
346211 dzielone przez 50 da 6924 całości i 11 reszty

Pisząc 5554123 \ 50 otrzymasz 111082 całości
Pisząc 5554123 % 50 otrzymasz 23 czyli resztę z dzielenia

Operator dzielenia może oznaczać 2 różne rzeczy albo dzielenie całkowite albo dzielenie dziesiętne jak na kalkulatorze zależnie od typu czy jest całkowity czy rzeczywisty.
Operator modullo % oblicza resztę z dzielenia przez liczbę.
no jak już sobie wylosuje to dodaje to +7 bo o taki offset chcesz przesunięcie zamiast losowania z przedziału 0-49.

0
szopenfx napisał(a):

eh...
dajmy na to, że losowane są liczby z dużego zakresu oto kilka z nich:
5554123 dzielone przez 50 da 111082 całości i 23 reszty
241 dzielone przez 50 da 4 całości i 41 reszty
74348 dzielone przez 50 da 1486 całości i 48 reszty
346211 dzielone przez 50 da 6924 całości i 11 reszty

Pisząc 5554123 \ 50 otrzymasz 111082 całości
Pisząc 5554123 % 50 otrzymasz 23 czyli resztę z dzielenia

Operator dzielenia może oznaczać 2 różne rzeczy albo dzielenie całkowite albo dzielenie dziesiętne jak na kalkulatorze zależnie od typu czy jest całkowity czy rzeczywisty.
Operator modullo % oblicza resztę z dzielenia przez liczbę.
no jak już sobie wylosuje to dodaje to +7 bo o taki offset chcesz przesunięcie zamiast losowania z przedziału 0-49.

A w poradniku z którego korzystam jest jasna informacja, że wpisanie tam 50 oznacza ile liczb ma być w przedziale... Nie rozumiem, takie poradniki są specjalnie tak upraszczane i nic nie wyjaśniają czy ktoś torlluje internet :/. Link do poradnika http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Pseudolosowe-liczby-calkowite/290

0

To wyrazenie rand() % 50 + 7(Przypominam ze operator "%" ma wyzszy priorytet niz dwuargumentowy "+" ).Dziala dokladnie tak:
2 % 50 reszta z dzielenia: 2
3 % 50 reszta z dzielenia: 3
...
49 % 50 reszta z dzielenia: 49
50 % 50 reszta z dzielenia: 0

Zatem samo wyrazenie rand() % 50 bedzie mialo wartosc od 0 - 49
Zatem przedzial z jakiego beda losowane liczby bedzie wynosil 7 - 56.
Zatem gdyby zapisac wzor: rand() % a + b.
przedzial wynosi: "od" b "do" (a+b)-1

0

cpp0x to dość dobry poradnik (ewentualnie poradnik z tytułem nieco na przerost "od zera do gier kodera"http://xion.org.pl/productions/texts/coding/megatutorial/ )

Wyjaśnię ci ten przykład nieco dokładniej:
rand() oznacza losowaną liczbę, następnie
% 50 czyli reszta z dzielenia przez 50. Wzięło się to stąd, że reszta z dzielenia przez 50 nigdy nie będzie większa bądź równa 50 (no bo jak?) - zakres wyniku tej liczby to zawsze od 0 do 49.
+ 7 czyli dodawanie 7 z modulo (tego poprzedniego działania). Skoro minimalny oraz maksymalny zakres losowania (ustalony przez modulo) wynosi odpowiednio 0 i 49, to po dodaniu 7 zakresami tymi będą 7 i 56.

Wynikiem będzie więc pseudolosowa liczba z zakresu 7-56.

0

Moim zdaniem przytoczony kurs bardzo dobrze tłumaczy sposób losowania liczb z żądanego zakresu. Ma niestety jeden błąd językowy. Autor napisał

ustalmy pierwszą losowana liczbę - na przykład 7
powinien raczej napisać
ustalmy najmniejszą losowaną liczbę - na przykład 7

50 jest ilością możliwych wyników,
7 jest najmniejszym możliwym wynikiem losowania.

0
robcio napisał(a):

To wyrazenie rand() % 50 + 7. Dziala dokladnie tak:
1 % 50 reszta z dzielenia: 1
2 % 50 reszta z dzielenia: 2
3 % 50 reszta z dzielenia: 3
...
49 % 50 reszta z dzielenia: 49
50 % 50 reszta z dzielenia: 0

Zatem samo wyrazenie rand() % 50 bedzie mialo wartosc od 0 - 49
Zatem przedzial z jakiego beda losowane liczby bedzie wynosil 7 - 57.

Ale jak to może kazać programowi trzymać się przedziału 7-57, skoro samo rand losuje dowolną liczbę np. 1345, więc co ją ogranicza do 57 skoro w tym przypadku (ja tak to rozumiem) program losuje dowolną liczbę np 1345 następnie dzieli ją przez 50 i dodaje 7?
@Edit: Rozumiem to co piszecie ale czemu liczba =( rand() % 50 ) + 7; ma dostać nowe właściwości które sprawiają, że określa on ramy od 7 do 50 a nie tak jak napisałem dwie linijki wyżej? Tego właśnie nie rozumiem...

0
rubesom napisał(a):

Ale jak to może kazać programowi trzymać się przedziału 7-57, skoro samo rand losuje dowolną liczbę np. 1345, więc co ją ogranicza do 57 skoro w tym przypadku (ja tak to rozumiem) program losuje dowolną liczbę np 1345 następnie dzieli ją przez 50 i dodaje 7?

Nie dzieli tylko oblicza resztę z dzielenia, Czyli podaje ile bo trzeba od tej wylosowanej liczby odjąć żeby podzieliła się przez 50 bez ułamka w wyniku Tak wiec jest zakres od zera (sama się dzieli), do 49 (np przy 999, -49 daje nam 950 co jest podzielne. natomiast następna czyli 1000 da wynik zero czyli większego niż 49 nie da się uzyskać. Teraz rozumiesz?) Generalnie zapamiętaj operator % (reszta z dzielenia) bywa przydatny.

1

OMFG jak nie kumasz co to jest reszta z dzielenia to wracaj do podstawówki dopiero później bierz się za programowanie.

0
0%50 = 0;
1%50 = 1;
2%50 = 2;
...
49%50 = 49;
50%50 = 0;
51%50 = 1;
...
1234%50 = 34;
1235%50 = 35;
...
3673693759052798%50 = 48;
3673693759052799%50 = 49;
3673693759052800%50 = 0;
...

innymi słowy:
Jeżeli a/b = c reszta d, to a%b = d

0
szopenfx napisał(a):

OMFG jak nie kumasz co to jest reszta z dzielenia to wracaj do podstawówki dopiero później bierz się za programowanie.

Wiem co to reszta z dzielenia. To czemu ktoś napisał, że zakres to 0-49 a inna osoba 7-57. To jaki to ma zakres?

0

zależy czy dodasz sobie do wylosowanej liczby to siedem czy nie

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