Porównanie liczby losowej

Porównanie liczby losowej
M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Witajcie. Mam problem z liczbami losowymi std::rand().
Mam taki kod:

Kopiuj
 srand( time( NULL ) );
...
int los;
for(j...){
for (i...){
if(pola[j][i].miasto>=0){
        los=rand()%100;
      if(los<51){
        pola[j][i].wojsko=1;
        ...
        }
}
}
}

Gdzie problem występuje z warunkiem (los<51). Kod ma zrekrutować wojownika z 50% szansą powodzenia. Zamiast sprawdzić warunek to podstawia liczbę która zawsze go spełni i w rezultacie w każdym mieście mam wojownika. Sprawdzałem wylosowane liczby i są one w tym przykładzie z przedziału 0-50. Jeżeli warunek byłby los==1, to wszystkie wylosowane liczby by były równe 1. Nie mam pojęcia dlaczego to nie działa, pewnie czegoś nie widzę albo nie wiem. Proszę o pomoc

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0
Kopiuj
if(los<51){ 
    pola[j][i].wojsko=1
}
// czy tutaj jest coś jeszcze?

Jeśli nie, to nie przypisujesz wartości niespełniajacych warunku.

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
Kopiuj
         int los;
     for(int i=0;i<=66;i++){
    for(int j=0;j<=51;j++){
    if(pola[j][i].kraj!=wybraniekraju){

if(pola[j][i].miasto>=0){
        los=rand()%100;
        
      if(los<51){
        pola[j][i].wojsko=1;
        pola[j][i].zycie=los;
        pola[j][i].atak=9;
        wojska[j][i].setTexture(tekstury[30]);
        }
}
    }
    }
     }

Daję cały kod. Próbowałem obciąć niepotrzebne rzeczy.

"Jeśli nie, to nie przypisujesz wartości niespełniajacych warunku." Objaśnisz to jaśniej? Myślę że los=rand()%100 mam po prostu inta na którym sprawdzam warunek. A pola[j][i].zycie=los; nie służy niczemu innemu jak sprawdzenie wylosowanej liczby

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0
Kopiuj
if(los<51){
        pola[j][i].wojsko=1;
        pola[j][i].zycie=los;
        pola[j][i].atak=9;
        wojska[j][i].setTexture(tekstury[30]);
        }

Ta część kodu obsługuje wartości do 50, a wyższe wartości są ignorowane.

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Tak. Założyłem że kod będzie rekrutować w niektórych miastach losowo. Czyli wtedy kiedy wylosuje liczbę 0-50 i dla każdego miasta losuje osobno. Ale on rekrutuje zawsze w każdych miastach, a los zawsze spełnia ten warunek, mimo że powinien około w 1/2 przypadkach. Dobrze objaśniam? może film nagram.
Albo tak:
Losuję pięć liczb z zakresu 0-100. I sprawdzam warunek czy jest mniejszy od 3.
I wylosowane liczby: 2, 0, 1, 2, 1
Warunek zawsze mam spełniony. Chodzi mi o wartości tych liczb że zawsze spełnią a nie powinny

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
1

Przykład działania twojego losowania w pętli i działa dobrze.
Nowsze narzędzie do losowania liczb: random.

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Ok, będę się bawił dalej. Dzięki za informację i zainteresowanie

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Jeszcze raz się zapytam, bo nie daję rady. Kod jest następujący:

Kopiuj
int los;

     for(int i=0;i<=66;i++){
    for(int j=0;j<=51;j++){
    if(pola[j][i].kraj!=wybraniekraju){

if(pola[j][i].miasto>=0){
los=rand()%101;

      if(los<3){
        pola[j][i].wojsko=1;
        pola[j][i].zycie=los;
        pola[j][i].atak=9;
        wojska[j][i].setTexture(tekstury[30]);
        }

}
    }
    }
     }

I wszystkie losy są 2, 1 albo 0, cokolwiek nie dam do warunku to one i tak to spełnią, chyba że to niemożliwe np. los>150.załączam film, gdzie nagrałem żołnierza w każdym mieście z życiem (los) jako 0, 1 lub 2. Jeżeli warunek bym miał (los==5) to wszystkie losy będą wtedy 5. Sprawdzałem i przed warunkiem losy są normalnie z zakresu 0-100. warunek if zmienia mi wartości losów tak, by zawsze pasowały
Jest to dość nietypowa dla mnie sytuacja, napiszcie z czym to może mieć związek.

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0
Kopiuj
los = rand() % 101; // losowana jest liczba z przedziału 0 - 100;
if (los<3) { // warunek sparawdza wylosowaną wartość i wykonuje instukcje wewnątrz tylko dla liczb 0, 1 i 2
    pola[j][i].wojsko = 1;
    pola[j][i].zycie = los;
    pola[j][i].atak = 9;
    wojska[j][i].setTexture(tekstury[30]);
}
// każda inna wartość nie jest zmieniana, aby była dopasowana do spełnienia warunku, 
// tylko jest ignorowana więc masz żołnierzy tylko z takimi wartościami `zycie`.

Dodaj do testu pole, które będzie przechowywać wartość licznika pętli,
a przekonasz się, że nie wszystkie wartości są przepuszczane przez warunek ifa.

Najlepiej zaprzyjaźnij się z debuggerem.
Pisz kod po angielsku.

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Rozumiem, ale wewnątrz if'a jest ustawianie tekstury żołnierza, więc jeżeli nie przejdzie to w ogóle nie powinno jego być, a jest w każdym mieście

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0

Debugger cię ratuje.
Jak widzisz żołnierze nie są na każdym polu, tylko na kilku.
I to są ci żołnierze, których przepuszczasz tym ifem.

.

Kopiuj
if (pola[j][i].miasto >= 0)

nie wiadomo jakie wartości mają poszczególne miasta,
ale jeśli program losuje ludzi dla wszystkich miast, to tutaj szukałbym błędu w pomyśle.

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Puste miasta wyglądają tak:
I one są zawsze na mapie. Po 'rekrutacji' nie ma pustych miast
title
Miasta to ta gruba kreska z 3 'wieżyczkami'
Te chudsze 'budynki' to porty, i ich nie zaliczam do miast

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0

Problem może leżeć po stronie wyświetlania. Wyświetlasz tylko tych prawidłowo wylosowanych żołnierzy.
Łap debugger. Im wcześniej zaczniesz z niego korzystać tym lepiej.

eidt: jeśli możesz dodaj jakieś printy w if(los < 3), aby zobaczyć jakie wartości tam się pojawiają.

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Debugger od jakiegoś czasu przy włączaniu wywala mi takie coś: "Program received signal SIGSEGV, Segmentation fault". Dlatego nie korzystam z niego, gdybym wcześniej sprawdził od czego się wywala, to prościej by mi było to naprawić

edit: (los<3, pola[j][i].zycie=los) czy (pola[j][i].zycie=los, los<3) ustawia życie żołnierzy od 0 do 100 i są w każdych miastach

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
2
Program received signal SIGSEGV, Segmentation fault
Błąd sugeruje naruszenie pamięci, prawdopodobnie wyjście poza zakres tablicy. Undefined behavior: co oznacza, że program może zachowywać się dziwnie i dowolny sposób. Kod należy doprowadzać do stanu gdy nie ma błędów i ostrzeżeń. W przeciwnym razie nie ma sensu szukanie błędów.
M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Podczas uruchamiania normalnie, było kilka ostrzeżeń, musiałem zrobić takie rzeczy jak zmiana nazwy kliku zmiennych w pętlach for. Teraz mam 0 błędów 0 ostrzeżeń, ale debugger swoje. Dostaje jeszcze coś takiego
title

M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Wystarczy że po if dodam else gdzie wycofuję zmiany które są zawarte w if. Pozornie niepotrzebne instrukcje, ale w ten sposób działa. Więc chyba to na tyle z mojego problemu. Dzięki za pomoc i zaangażowanie

Edit: nie pomyślałem żeby w takiej sytuacji korzystać z plików- jest możliwość zapisania gry gdzie wszystkie informacje zapisuje do plików, takie jak życie, i parametry do tego podobne, to na pewno pomoże :)

Edit2: Teraz nawet nie potrzebuje tego else do poprawnego działania. Wszystko działa 100% dobrze dopiero, gdy przeniosłem ten kod w inne miejsce w pliku cpp. To dopiero rozwiązało w pełni problem. Teraz będę mógł skończyć projekt :)

KM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 87
2

Odpal grę pod valgrindem i tam napraw wszystkie błędy.

Edit: och, to windows. W takim razie najpierw znajdź odpowiednik valgrinda pod Windows.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.