• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd w losowaniu bez powtórzeń.

Object Storage Arubacloud
0 głosów
180 wizyt
pytanie zadane 2 października 2015 w C i C++ przez Caspariano Użytkownik (760 p.)

Witam. Otóż zrobilem bool'a który zwraca wartość prawda jeśli liczba nie była jeszcze wylosowana. Wszystko działa pięknie, ale przy pierwszym teście, dwie ostatnie liczby miały tą samą wartość. Próbowałem odtworzyć to zdarzenie, ale więcej się nie powtórzyło. I tu moje pytanie, czy ktoś z bardziej doświadczonych koderów mógłby spojrzeć na ten kod i powiedzieć mi czy gdzieś jest błąd, ja analizowałem ale do niczego nie doszedlem. Nie chcę aby to powtórzyło się potem w aplikacji. Pozdrawiam ;)

 

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

bool czy_wylosowana(int liczba, int wylosowane[], int wylosowanych)
{
  for (int i=0 ; i <= wylosowanych; i++)
  {
      if(liczba == wylosowane[i]) return false;
  }

  return true;
}

int main()
{
    srand(time(NULL));
    int wylosowane[12];
    int wylosowanych=0;
    int liczba;

    
    while(wylosowanych < 12)
    {
        liczba = (rand() % 12) +1;

        if(czy_wylosowana(liczba,wylosowane,wylosowanych))
        {
            wylosowane[wylosowanych] = liczba;
            wylosowanych ++;
            cout << liczba << ", ";
        }

    }




    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 2 października 2015 przez niezalogowany
edycja 2 października 2015

Hmm dość ciekawie zwracasz wartości w

bool czy_wylosowana(int liczba, int wylosowane[], int wylosowanych)
{
  for (int i=0 ; i <= wylosowanych; i++)
  {
      if(liczba == wylosowane[i]) return false;
  }
 
  return true;
}

Otóż w momencie gdy liczba została wylosowana zwracasz false, podczas gdy nie wylosowano żadnej zwracasz true (nie powinno być odwrotnie?)

@EDIT widzę, że if'a też użyłeś w przeciwieństwie do tego jak nazwałeś funkcję

komentarz 2 października 2015 przez Caspariano Użytkownik (760 p.)
Rozumiem że chodzi tylko o logikę. While w kodzie ma ustawionego tak że jeśli funkcja zwróci wartość prawda to jest to znak że liczba nie została wczesniej wylosowana i może ją zapisać do tablicy.

 

PS.Powinienem nazwć funkcję, "czy_niewylosowana" heh
komentarz 2 października 2015 przez niezalogowany
Tak, chodzi jedynie o intuicję zapisu, bo u ciebie funkcja odpowiada na pytanie: "czy ta liczba jest już wylosowana?"

- "tak jest" w momencie gdy nie jest oraz "nie jest wylosowane" w momencie gdy jest

Jednak w if'ie i tak masz zanegowaną odpowiedź, więc wszystko działa poprawnie. Na oko nie widzę błędu w kodzie
komentarz 2 października 2015 przez niezalogowany
Może to był jakiś chwilowy błąd kompilatora albo coś zmieniałeś, a może coś po prstu mi umknęło
0 głosów
odpowiedź 2 października 2015 przez maly Nałogowiec (37,190 p.)
for (int i=0 ; i <= wylosowanych; i++)

Sprawdzasz za daleko.

komentarz 2 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Zauważ, że funkcja czy_wylosowana nie otrzyma wartości większej, niż 11, więc wszystko jest poprawne.

komentarz 2 października 2015 przez maly Nałogowiec (37,190 p.)
A index 11 to ostatnia komórka w tablicy o rozmiarze 12, więc ta pętla przy takim indekcie spróbuje pobrać komórkę 13.
komentarz 2 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Jak? Przecież przy wylosowanych = 12, program wyjdzie z pętli while i pętla for nigdy się nie wykona, więc największą wartością, jaką dostanie funkcja, jest 11 i wszystko będzie działać poprawnie, ponieważ jest to ostatni element tablicy.

komentarz 2 października 2015 przez maly Nałogowiec (37,190 p.)
Racja, coś źle skalkulowałem :)
0 głosów
odpowiedź 2 października 2015 przez event15 Szeryf (93,790 p.)
http://ideone.com/WjZMJP

Moim zdaniem działa to dobrze :)

Podobne pytania

0 głosów
2 odpowiedzi 316 wizyt
+1 głos
1 odpowiedź 1,074 wizyt
0 głosów
2 odpowiedzi 591 wizyt
pytanie zadane 29 października 2016 w C i C++ przez BlueWee Użytkownik (730 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...