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

VPS Starter Arubacloud
0 głosów
219 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 356 wizyt
+1 głos
1 odpowiedź 1,125 wizyt
0 głosów
2 odpowiedzi 611 wizyt
pytanie zadane 29 października 2016 w C i C++ przez BlueWee Użytkownik (730 p.)

93,018 zapytań

141,984 odpowiedzi

321,282 komentarzy

62,364 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...