Porównanie liczby losowej

0

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

 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

0
if(los<51){ 
    pola[j][i].wojsko=1
}
// czy tutaj jest coś jeszcze?

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

0
         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

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

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

1

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

0

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

0

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

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.

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

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

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.

.

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.

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

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

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

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

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

2

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

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

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