Losowanie liczb z określonego zakresu

0

Cześć,
pojawił mi się problem z pewnym zadaniem. Żeby nie przepisywać całego zadania wytłumaczę fragment istotny dla naprawienia mojego błędu. Na wejściu jest podana liczba x(wada wzroku bramkarza) i n (liczba rzutów do bramki) następnie ciąg n liczb(oznaczają one odległość piłki od momentu rzutu do bramki). No więc jeżeli jedna liczba z ciągu tych n liczb, będzie większa lub równa x to rzut jest przepuszczony.
przykład
wejście: x=10 n=5
12 34 2 31 90
wyjście: 1 \ponieważ tylko 1 jest <x czyli 10
Mam nadzieję że wytłumaczyłam w zrozumiany dla was sposób 😅.

Mój kod:

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
  int x,n,przepuszczone=0;
  cin>>x>>n;
  for (int j=0; j<n; j++)
    {
      cout<<rand()%126<<" ";
      
        if(rand()%126>=x)
        {
          przepuszczone+=1;
        }
    }
  cout<<endl<<przepuszczone;
    return 0;
}

Nie jestem pewna czy te pięć liczb mają być randomowe bez zakresu, czy z zakresem (rozmiar boiska. No raczej piłka nie zostanie rzucona z odległości np. 8302765 😉) ale nie na tym na razie polega mój problem.

Wszystko prowadzi do tego że jak wpisuje: x=10 n=5 program wylosowuje mi liczby: 1 9 113 10 15 a następnie wypisuje mi: 5 choć powinien wypisać: 3
Jeżeli wytłumaczyłam tak, że nikt niczego nie rozumie to proszę napisać to wyślę treść całego zadania ;).

0

Dlaczego uważasz, że program powinien wypisać 3? Nie seedujesz RNG jakoś konkretnie, skąd wiesz, kiedy wchodzi do ifa z 13. linijki, i czemu właśnie miałby to zrobić dokładnie trzy razy?

A oprócz tego, nie używaj rand — zbyt łatwo go użyć źle, tak jak tutaj (nie masz jednorodnego rozkładu). Używaj <random>.

0

Przecież podano wyraźnie, przyklad:
wejście: x=10 n=5
12 34 2 31 90

0

może podpowiesz co konkretnie mam zmienić?

0
LubieMatme321100 napisał(a):

może podpowiesz co konkretnie mam zmienić?

Nie mogę bo nie zgadnę pełnej treści zadania.

1

To może ja rozwinę to, co pisałem, skoro powyższa podpowiedź nie pomogła — zauważ, że w linijce 11. wypisujesz wynik innego losowania, niż w linijce 13. Wygląda to jak błąd, a jeśli nie jest błędem, to skąd założenie, że przepuszczone ma być takie a nie inne?

0

może o to chodzi ?

int main()
{
    int wada, iloscRzutow, odlegloscPilki = 0;

    cin >> wada >> iloscRzutow;

    srand(time(NULL)); //brak ci tego

    for(int i=0; i<iloscRzutow; ++i){
        odlegloscPilki = rand()%126;

        if(odlegloscPilki>wada){
            cout << "Odleglosc pilki " << odlegloscPilki << " i jest gol !!" << endl;
        }
        else{
            cout << "bramkarz obronil" << endl;
        }
    }
}
0
_13th_Dragon napisał(a):
LubieMatme321100 napisał(a):

może podpowiesz co konkretnie mam zmienić?

Nie mogę bo nie zgadnę pełnej treści zadania.

Historyjka:
W pewnym liceum właśnie zaczyna się mecz klasowy piłce nożnej. Bajtek jest najlepszym bramkarzem w klasie (broni każdy strzał). Jest jednak pewien problem- Bajtek ma problemy ze wzrokiem. Jego wadę wzroku opisujemy za pomocą wartości x. Bajtek obroni każdy strzał, który został oddany z odległości bliższej (mniejszej) niż x, ale nie obroni oddanego z większej lub równej x-owi odległości.
Wejście:
Na wejściu podana jest liczba x - wada wzroku Bajtka, n - liczba oddanych strzałów, następnie znajduje się ciąg n liczb (oddzielonych spacją), które wyznaczają odległość od bramkarza podczas oddawania strzałów.
Wyjście:
Na wyjściu powinna znaleźć się jedna liczba całkowita - liczba przepuszczonych przez bramkarza strzałów.

0

Biorąc historyjkę wyżej zapewne to będzie rozwiązaniem twojego problemu

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
  int x,n,przepuszczone=0;
  cout << "Wada wzroku: ";
  cin >> x;
  cout << "Liczba strzalow: ";
  cin >> n;
  int losowa_odleglosc;
  for (int j=0; j<n; ++j)
    {
        losowa_odleglosc = rand()%126;
        cout << losowa_odleglosc<<" ";
        if(losowa_odleglosc >= x)
        {
          przepuszczone++;
        }
    }
  cout<<endl<<przepuszczone;
    return 0;
}


Tutaj przykład z użyciem biblioteki <random>

#include <iostream>
#include <random>
using namespace std;

int main()
{
  int x,n,przepuszczone=0;
  cout << "Wada wzroku: ";
  cin >> x;
  cout << "Liczba strzalow: ";
  cin >> n;
  random_device rd;
  uniform_int_distribution<int> dist(0,125);
  int losowa_liczba;
  for (int j=0; j<n; ++j)
    {
        int losowa_liczba = dist(rd);
        cout << losowa_liczba << " ";
        if(losowa_liczba >= x)
        {
          przepuszczone++;
        }
    }
  cout<<endl<<przepuszczone;
    return 0;
}

1
LubieMatme321100 napisał(a):

W pewnym liceum właśnie zaczyna się mecz klasowy piłce nożnej. Bajtek jest najlepszym bramkarzem w klasie (broni każdy strzał). Jest jednak pewien problem- Bajtek ma problemy ze wzrokiem. Jego wadę wzroku opisujemy za pomocą wartości x. Bajtek obroni każdy strzał, który został oddany z odległości bliższej (mniejszej) niż x, ale nie obroni oddanego z większej lub równej x-owi odległości.
Wejście:
Na wejściu podana jest liczba x - wada wzroku Bajtka, n - liczba oddanych strzałów, następnie znajduje się ciąg n liczb (oddzielonych spacją), które wyznaczają odległość od bramkarza podczas oddawania strzałów.
Wyjście:
Na wyjściu powinna znaleźć się jedna liczba całkowita - liczba przepuszczonych przez bramkarza strzałów.

Teraz ewidentnie napisano co jest na wejściu:

#include <iostream>
#include <iterator>
using namespace std;

int main() // 10 5 12 34 2 31 90
{
    istream_iterator<int> iin(cin);
    int x=*iin,count=*++iin,missed=0;
    for(int distance=0;count--;missed+=(distance<x)) distance=*++iin;
    cout<<missed<<endl;
    return 0;
}
0
_13th_Dragon napisał(a):
LubieMatme321100 napisał(a):

W pewnym liceum właśnie zaczyna się mecz klasowy piłce nożnej. Bajtek jest najlepszym bramkarzem w klasie (broni każdy strzał). Jest jednak pewien problem- Bajtek ma problemy ze wzrokiem. Jego wadę wzroku opisujemy za pomocą wartości x. Bajtek obroni każdy strzał, który został oddany z odległości bliższej (mniejszej) niż x, ale nie obroni oddanego z większej lub równej x-owi odległości.
Wejście:
Na wejściu podana jest liczba x - wada wzroku Bajtka, n - liczba oddanych strzałów, następnie znajduje się ciąg n liczb (oddzielonych spacją), które wyznaczają odległość od bramkarza podczas oddawania strzałów.
Wyjście:
Na wyjściu powinna znaleźć się jedna liczba całkowita - liczba przepuszczonych przez bramkarza strzałów.

Teraz ewidentnie napisano co jest na wejściu:

#include <iostream>
#include <iterator>
using namespace std;

int main() // 10 5 12 34 2 31 90
{
    istream_iterator<int> iin(cin);
    int x=*iin,count=*++iin,missed=0;
    for(int distance=0;count--;missed+=(distance<x)) distance=*++iin;
    cout<<missed<<endl;
    return 0;
}

No, nieźle... :) Tylko że takich komend jakistream_iterator<int>, count czy *iin.missed=0jeszcze nie znam i nie rozumiem. Poczytałem co nie co o tym w necie, ale niestety dla mnie to za mało żeby zrozumieć 😅...

0

int x=*iin,count=*++iin,missed=0; to to samo co:

int x=*iin;
int count=*++iin;
int missed=0;

Doprawdy nie znasz komend count i missed?
Co do istream_iterator<int> iin(cin); to się łatwo znajdzie w google c++ istream_iterator po przeczytaniu i obejrzeniu przykładów powinno być jasne.
Można też ten wiersz wywalić i zastąpić użycie iin zwykłym wczytaniem z cin

0

Wiem co to missed, o komendzie count tak naprawdę po raz pierwszy słyszę. Ale jak już mówiłem, czytałem trochę w internecie i teraz już chyba rozumiem do czego służy( wypisuje ilość elementów w jakimś zakresie, czy jakoś tak).

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