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

Witam. Jaki jest najprostszy sposób losowania bez powtorzeń w c++?

+4 głosów
2,713 wizyt
pytanie zadane 5 kwietnia 2015 w C i C++ przez igor1988bb Użytkownik (800 p.)

7 odpowiedzi

+5 głosów
+2 głosów
odpowiedź 5 kwietnia 2015 przez DawidRodycz Gaduła (3,110 p.)
Jeszcze kiedyś jak przerabiałem kurs napisałem ten kod:

// Losbezpowtorzen.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "ctime"

using namespace std;

int wylosuj()
{
    return (rand() % 20) + 0;
}

bool czyPrawda(int wylosowanE[], int ilE,int wylosowanA)
{
    int licznik = 0;
    if (ilE == 0)
        return true;
    do
    {
        if (wylosowanA == wylosowanE[licznik])
        return false;
        licznik++;
    } while (licznik < ilE);
    return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));

    int ile = 0;
    int wylosowane[18];
    int wylosowana;

    do
    {
        wylosowana = wylosuj();
        if (czyPrawda(wylosowane, ile, wylosowana) == true)
        {
            wylosowane[ile] = wylosowana;
            ile++;
        }
    } while (ile < 17);

    for (int i = 0; i < 17; i++)
    {
        cout << endl << wylosowane[i];
    }

 

    

 

    system("PAUSE");
    return 0;
}


To są tzw pseudolosowe liczby, o ile wgl rozumiesz o co chodzi. Przeanalizuj sobie ten kod, napisz jeżeli nie rozumiesz co i w którym miejscu kod robi.

+1 głos
0 głosów
odpowiedź 5 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
0 głosów
odpowiedź 5 kwietnia 2015 przez Prime_Bull Obywatel (1,820 p.)

Kiedyś na potrzeby programu losującego sześć liczb musiałem zrobić losowanie bez powtórzeń. Może nie jest to najlepszy sposób, ale działa :D

#include <iostream>
#include <windows.h>
#include <time.h>

using namespace std;

int main()
{
    int liczby[6];

    cout << "Za chwile nastapi wylosowanie szesciu liczb!" << "\n";
    Sleep(3000);
    cout << "Zwolnienie blokady!" << "\n" << "\n";
    Sleep(1500);

    srand(time(0));

    for(int i=0; i<6; i++)
    {
        liczby[i]=rand()%48+1;
        if(liczby[i]==liczby[i-1] || liczby[i]==liczby[i-2] || liczby[i]==liczby[i-3] ||
           liczby[i]==liczby[i-4] || liczby[i]==liczby[i-5]|| liczby[i]==liczby[i-6]   )
        {
            liczby[i]=rand()%48+1;
            cout << i+1 << ". " << liczby[i] << "\a" << "\n";
            Sleep(1000);
        }
        else
        {
           cout << i+1 << ". " << liczby[i] << "\a" << "\n";
           Sleep(1000);
        }
    }

    return 0;
}

 

 

komentarz 5 kwietnia 2015 przez Włóczykij Użytkownik (750 p.)
edycja 5 kwietnia 2015 przez Włóczykij

W tym kodzie jest błąd, ponieważ jeśli "if" sprawdzi czy taka sama liczba nie została wylosowana to losuje jeszcze raz i może wylosować już liczbę wcześniej wylosowaną.

0 głosów
odpowiedź 5 kwietnia 2015 przez Włóczykij Użytkownik (750 p.)
Ten temat zostałnawet poruszony przez Pana Mirka i nawet jest fajna gra zrobiona do tego.

http://miroslawzelent.pl/informatyka/losowanie-bez-powtorzen-php-c++-gra-milionerzy/
0 głosów
odpowiedź 17 kwietnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Jest to bardzo proste.
Funkcja losująca wrzuca liczby do tablicy, a w pętli sprawdzasz if'em czy nie ma przypadkiem takowej liczby.
I tu podpowiedź : Jeżeli jest to cofnij się o jedno  ( i-- ) zacznij losowanie na danym miejscu w tabicy jeszcze raz.
I nie używaj goto :P

Chcę żebyś sam pomyślał, bo jak Ci udostępnie gotowy kod to się nie rozwiniesz intelektualno-programistycznie :D
komentarz 17 kwietnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Jeżeli nie czaisz to napisz na priva

Podobne pytania

–1 głos
2 odpowiedzi 1,254 wizyt
0 głosów
2 odpowiedzi 870 wizyt
pytanie zadane 18 czerwca 2019 w Bezpieczeństwo, hacking przez Ygrek Nowicjusz (190 p.)

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,368 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...