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

C++ - losowanie bez powtórzeń

Object Storage Arubacloud
0 głosów
855 wizyt
pytanie zadane 3 lutego 2017 w C i C++ przez seba Dyskutant (8,900 p.)
Witam, napisałem przed chwilą program do losowania liczb pseudolosowych bez powtórzeń, ku mojemu zaskoczeniu zadziałał za pierwszym razem. Miał wylosować liczby z przedziału od 1...5. Wylosował po kolei liczby 3 4 2 1 5. Drugi raz uruchamiam program i niestety konsola CMD świeci pustkami. Nie wyskoczył żaden błąd ani w CodeBlocks'ie ani w konsoli CMD. Wyłączyłem CodeBlocka, uruchomiłem jeszcze raz i znowu zadziałał, niestety po ponownym uruchomieniu kicha nic do wyświetlenia. Teraz nawet po wyłączeniu CodeBlocka jest pustka. Wydaję mi się że kod jest czysty ale oczywiście mogę się mylić. Oto on:
 

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

int main()
{
    int liczba[5],wylosowana;
    bool prawda=true;
    srand(time(NULL));

    for(int i=0;i<5;i++)
    {
        wylosowana=rand()%5+1;

        for(int j=0;j<5;j++)
        {
            if(liczba[j]==wylosowana)prawda=false;
        }
        if(prawda==true)
        {
         liczba[i]=wylosowana;
        }
        else i--;
    }
    for(int i=0;i<5;i++)
    {
        cout<<liczba[i]<<endl;
    }

    getchar();getchar();
    return 0;
}

2 odpowiedzi

+1 głos
odpowiedź 3 lutego 2017 przez mbabane Szeryf (79,280 p.)
wybrane 3 lutego 2017 przez seba
 
Najlepsza

Wydaje mi sie ze masz nastepujacy blad: jesli znajde powtorzenie to juz nie ma szans aby zmienna prawda stala sie true, przez co caly czas dekrementowane jest i co powoduje nie mozliwosc wyjscia z petli.

 

PS: Uzywaj odpowiedniego znacznika do wstawiania kodu (przycisk {...}code w edytorze.

komentarz 3 lutego 2017 przez seba Dyskutant (8,900 p.)
Jak tak dłużej zacząłem się temu przyglądać też to zauważyłem dzięki :)
komentarz 3 lutego 2017 przez seba Dyskutant (8,900 p.)

Po zmianie działa jeszcze raz dzięki za trafną uwagę.
 

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

int main()
{
    int liczba[5],wylosowana;
    bool prawda;
    srand(time(NULL));

    for(int i=0;i<5;i++)
    {
        wylosowana=rand()%5+1;
        prawda=true;
        for(int j=0;j<5;j++)
        {
            if(liczba[j]==wylosowana)prawda=false;
        }
        if(prawda==true)
        {
         liczba[i]=wylosowana;
        }
        else i--;
    }
    for(int i=0;i<5;i++)
    {
        cout<<liczba[i]<<endl;
    }

    getchar();getchar();
    return 0;
}

 

+1 głos
odpowiedź 3 lutego 2017 przez niezalogowany
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <stdio.h>
using namespace std;

int main()
{
    int liczba[5],wylosowana;
    bool prawda=true;
    srand(time(NULL));

    for(int i=0;i<5;i++)
    {
        prawda = true; // gdy w poprzednim rozliczeniu petli byla rowna false
        wylosowana=rand()%5+1;

        for(int j=0;j<5;j++)
        {
            if(liczba[j]==wylosowana)
                prawda=false;
        }
        if(prawda==true)
        {
            liczba[i]=wylosowana;
        }
        else i--;
    }
    for(int i=0;i<5;i++)
    {
        cout<<liczba[i]<<endl;
    }

    getchar();getchar();
    return 0;
}

Nie mniej jednak zrobiłbym jeszcze taki myk:

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

int main()
{
    int liczba[5],wylosowana;
    bool prawda=true;
    srand(time(NULL));

    for(int i=0;i<5;i++)
    {
        prawda = true;
        wylosowana=rand()%5+1;

        for(int j=0;j<i;j++) // po co sprawdzac caly zakres jak sa tam przypadkowe wartosci?
        {
            if(liczba[j]==wylosowana)
                prawda=false;
        }
        if(prawda==true)
        {
            liczba[i]=wylosowana;
        }
        else i--;
    }
    for(int i=0;i<5;i++)
    {
        cout<<liczba[i]<<endl;
    }

    getchar();getchar();
    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 382 wizyt
pytanie zadane 21 marca 2017 w C i C++ przez seba Dyskutant (8,900 p.)
0 głosów
2 odpowiedzi 1,180 wizyt
pytanie zadane 5 lipca 2016 w C i C++ przez dokolyski Początkujący (290 p.)
0 głosów
1 odpowiedź 395 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez m_rij_v Użytkownik (660 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...