1 / 10
Dec 2017
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    srand(time(0));
    int w = 0;
    int p;
    int suma;

    for (int x = 0; x < 10; x++) {
        int r = rand() % 2;
        p = -w;

        cout << "x nr.: " << x << ". "
             << "r: " << r << "  ";

        if (r == 1) {
            w++;
            cout << "w: " << w << endl;
        }
        if (r == 0) {
            p--;
            cout << "p: " << p << endl;
        }
    }

    suma = w + p;
    cout << "  suma:" << suma;

    return 0;
}

Czegoś nie wiem, nie potrafię zrozumieć dlaczego program zlicza sume w taki a nie inny sposób.

Przy 10-ciu losowaniach przebieg wygląda następująco +1-2-2+2-3+3-4+4+5+6. Suma = 2(wg programu który napisałem), a powinna równać się 10. Nie wiem jakich elementów, funkcji c++ należy użyć do napisania takiego programu. Chyba jest dość banalny. Nie wiem gdzie leży błąd którego nie rozumiem.

Dziękuję.

  • created

    Dec '17
  • last reply

    Dec '17
  • 9

    replies

  • 1.0k

    views

  • 3

    users

  • 2

    likes

  • 4

    links

Program zlicza wszystko tak jak sugeruje jego kod. Sam sobie skomplikowałeś liczenie definiując w przed pętlą, ale p już tylko deklarując. Rand analizy nie upraszcza. Inicjalizacja p = -w wewnątrz pętli także.

Ale rand jest konieczne. Nie jestem pewien czy 1 zmiena wystarczy. Zasada bardzo prosta. Wygrana +1, przegrana - (suma wygranych do tej pory), jesli ponownie wygrana kobtynuacja inkrementacji. Nie wiem czy tablice sa konieczne czy moze jedna zmienna jest wystarczającą do napisania programu . Dziekuje za pomoc.

Wygrana - +1. Przegrana - -1. Czyli +1-2-2+2-3+3-4+4+5+6 = 2. Więc Twój program liczy prawidłowo i nie rozumiem dlaczego miałoby być 10.

Wygraną zapewne realizuje w++, a przegraną? Masz p–, a nie p - suma wygranych do tej pory.

To dlaczego w ifach nie dodajesz do sumy aktualnych w albo p? (o ile rozumiem o co Ci chodzi, a pewnie nie rozumiem :wink: )

Dziękuję za wszystkie odpowiedzi.
Znacznie lepiej, pomimo iż to jeszcze nie to, jestem na dobrej drodze. Przy dłuższej chwili wolnego czasu powinno ruszyć. Do tego umiejętności poszły w górę, i pojawiają się bardziej zaawansowane pomysły. Czas na podręcznik c++.

Raz jeszcze dzięki.

PS.
Tak domyślam się, że nie jest do końca jasne o co mi chodzi, bo i nie rozpisuje swojego problemu z pomysłem całkowicie, tylko fragment z którym mam problemy.

Sprecyzuj swój problem matematycznie a myślę, że ktoś Ci pomoże bardziej niż ja dotychczas. No chyba, że już dajesz rade samemu to ok :slight_smile:

Pozwoliłem sobie zabawić się z Twoim programem. Jeśli dobrze rozumiem to, że wygrana daje plus 1, a przegrana minus liczba wygranych losowań, to program może wyglądać tak:
https://ideone.com/gSKhsZ1
Jak widać potrzebuje “jedną” zmienną i tym samym nie potrzebuje tablic.

Jeśli chodzi o Twoją wersję, to liczysz sumę poza przebiegiem pętli, czyli tak naprawdę sumujesz liczbę zwycięstw z liczbą przeciwną do liczby zwycięstw pomniejszoną/powiększoną o jeden w zależności od ostatniego losowania.
Przyjmijmy:
w - zwycięstwo
p - porażka
x - liczba zwycięstw
weźmy teraz np dane 7 razy w, 3 razy p , gdzie ostatnia była p. Suma=7+(-8)=-1
Twój program dla tych danych: https://ideone.com/P14p3H1

teraz wybierzmy dane 7 razy w, 3 razy p, gdzie ostatnia była w. Suma=7+(-6)=1
Twój program dla tych danych: https://ideone.com/igIsA21

Zatem w ogólności twój program zwraca: x+(-x±1)

lub inaczej:
funkcja(ostatnie_losowanie):
|1 dla ostatnie_losowanie=1;
|-1 dla ostatnie_losowanie=0;

Dowód “metodą chińską” dla tego powyżej: https://ideone.com/7V9HDk3