Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zapis różnych (nie powtarzających się) liczb w tablicy

Ostatnio zmodyfikowano 2010-07-19 14:54
Autor Wiadomość
021995
Temat założony przez niniejszego użytkownika
Zapis różnych (nie powtarzających się) liczb w tablicy
» 2010-07-19 04:07:39
Witam

tytuł może i ma nietypową nazwę ale nie ma tego jak krótko zapisać

problem mam taki że nie wiem jak zapisać żeby w tablicy nie powtarzały się wylosowane liczby funkcją rand()

z góry dzięki za pomoc


aha napisałem posta parę minut temu ale coś ostatnio ddt wolno chodzi i jak dodałem temat to nie wyświetliła się ani nazwa tematu
kiedy otwarcie cpp0x ? :] bo moim zdaniem ddt to krótsza domena i lepiej pasuję :]
P-19976
MAKONDE
» 2010-07-19 10:49:01
myślę że można zrobić drugą tablice do której wylosować liczby i zobaczyć czy są równe...nie wiem czy będzie działało...właśnie sprawdzam :P
P-19977
wojos
» 2010-07-19 11:39:03
Pamiętam, że kiedyś borykałem się z tym samym problemem i wpadłem na pomysł, żeby przed każdym losowaniem wywoływać funkcję srand z czasu pomnożonego przez pewien współczynnik:
C/C++
int LiczbaLosowa( int Min, int Max, int Wsp )
{
    srand( static_cast < unsigned int >( time( NULL ) * Wsp ) ); //tutaj owa funkcja
    int Wynik =( rand() %( Max - Min + 1 ) + Min );
    return Wynik;
}
A tu przykład jak można skorzystać z tego w programie:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;


int LiczbaLosowa( int Min, int Max, int Wsp )
{
    srand( static_cast < unsigned int >( time( NULL ) * Wsp ) );
    int Wynik =( rand() %( Max - Min + 1 ) + Min );
    return Wynik;
}


int main()
{
    int tab[ 5 ];
    for( int i = 0; i < 5; i++ )
    {
        tab[ i ] = LiczbaLosowa( 1, 100, i + 1 ); /*Przy każdym losowaniu używany jest inny współczynnik dzięki czemu unikamy powtarzalności liczb*/
    }
    for( int i = 0; i < 5; i++ )
    {
        cout << "Liczba" << i + 1 << ": " << tab[ i ] << endl;
    }
    return 0;
}
Można ten program skompilować i sprawdzić, że działa. Tak czy owak jest to tylko mój pomysł na rozwiązanie problemu i nie mogę powiedzieć czy jest to najwydajniejszy sposób.

EDIT: Korzystając jednak z tego sposobu trzeba uważać, żeby nie skorzystać z współczynnika równego 0 bo wtedy za każdym razem wynik losowanej liczby będzie taki sam :P Dlatego albo w funkcji LosowaLiczba trzeba zastosować odpowiedni chwyt zapobiegający użyciu 0 lub po prostu nigdy 0 nie używać w kodzie (to pierwsze chyba lepsze :P).
P-19978
lenrokskate
» 2010-07-19 12:42:11
może lepiej przez rekurencję?

C/C++
int LiczbaLosowa( int Min, int Max, int Wsp, int * tablica )
{
    int rozmiar = sizeof( tablica );
    static int ifor;
    srand( static_cast < unsigned int >( time( NULL ) * Wsp ) );
    int Wynik =( rand() %( Max - Min + 1 ) + Min );
    ifor++;
    if( ifor < rozmiar )
    {
        LiczbaLosowa( Min, Max, Wsp + 1, tablica );
    }
}

zaraz sprawdzę czy działa
P-19979
VND
» 2010-07-19 12:56:43
Zmiana współczynnika w żadnym wypadku nie zabezpiecza przed ponownym wylosowaniem tej samej wartości. Powoduje tylko losowanie innego zestawu liczb, ale nie ma nic wspólnego z powtarzalnością. Przekonasz się o tym gdy zmniejszysz zakres losowanych liczb, teraz ciężko jest trafić dwie takie same w przedziale 1-100.
Jedynym wyjściem jest sprawdzać już wylosowane liczby, jeśli już była ponowić losowanie i tak aż do skutku.

C/C++
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;

int tabela[ 10 ];

bool juz_byla( int n, int ilosc )
{
    for( int i = 0; i < ilosc; ++i )
    {
        if( tabela[ i ] == n )
             return true;
       
    }
    return false;
}
int main()
{
    srand( time( NULL ) );
    int los, licznik = 0;
    while( licznik < 10 )
    {
        los = rand() % 20; //górny zakres losowanych liczb
        if( !juz_byla( los, licznik ) )
        { tabela[ licznik ] = los; licznik++; }
    }
    for( int i = 0; i < 10; i++ )
    {
        cout << tabela[ i ] << endl;
    }
    return 0;
}
P-19980
wojos
» 2010-07-19 13:17:56
Nie zabezpiecza natomiast korzystając z czasu mnożonego współczynnik powoduje się rzeczywistą różnorodność liczb, jeżeli wylosujemy całą tablicę w jednej pętli for bez współczynnika to procesor zrobi to tak szybko, że czas nawet nie zdąrzy się zmienić. Dlatego usuwając współczynnik z mojego kodu wszystkie 5 liczb będzie takie same (np. 90, 90, 90, 90, 90; rzadko ale jednak może zdarzyć się np. taka sytuacja: 90, 90, 90, 91, 91). Można zastosować mechanizm sprawdzający czy się nie powtarza liczba i to jest oczywiste pod warunkiem, że tego chcemy. Tak też zrobiłem we własnym projekcie gdy go tworzyłem. Natomiast tutaj pisałem tylko o sposobie zróżnicowania wyników.

EDIT: a z losowaniem aż do skutku też próbowałem ale powodowało tylko strasznie powolną pracę programu.
P-19982
021995
Temat założony przez niniejszego użytkownika
» 2010-07-19 14:54:08
Liczba1: 3
Liczba2: 3
Liczba3: 3
Liczba4: 2
Liczba5: 3
Liczba6: -858993460
Liczba7: 281102953
Liczba8: 1245112
Liczba9: 4270223


:]

#edit

dzięki wszystkim ten kod wojas'a źle losował ;] bo się liczby powtarzały :] dzięki za pomoc
P-19987
« 1 »
  Strona 1 z 1