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

c++ funkcja losująca liczby prawdziwie losowe

Ostatnio zmodyfikowano 2019-12-01 12:07
Autor Wiadomość
Lewy1607
Temat założony przez niniejszego użytkownika
c++ funkcja losująca liczby prawdziwie losowe
» 2019-11-28 18:22:25
Witam.Ostatnio napisałem swój własny algorytm losujący i wyświetlający prawdziwie losowe liczby.Problem mam jednak taki,że jak użyje go wewnątrz funkcji,to program na niektórych podanych liczbach się wysypuje tj: 18,26,250 itp.
Nie wiem w czym jest problem,ponieważ owy algorytm użyty bezpośrednio w funkcji main działa prawidłowo z tymi liczbami.
Proszę o szybką pomoc.Pozdrawiam.

algorytm użyty w funkcji:

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>
using std::cout;
using std::cin;
void true_rand( int n );
//**********************
int main()
{
    int ile;
    cout << "Ile chcesz wylosowac prawdziwie losowych liczb i wyswietlic?: "; cin >> ile;
    cout << "\n";
    true_rand( ile );
    return 0;
}
//***********************
void true_rand( int n )
{
    int tab1[ n ];
    int tab2[ n ];
    int i; int j = 0;
    srand( time( NULL ) );
    for( i = 0; i < n; i++ )
    {
        tab1[ i ] = rand() % n + 1;
    }
    for( j = 0; j < n; j++ )
    {
        for( i = - 1; i < n; i++ )
        {
            if( tab1[ j ] == tab2[ i ] )
            {
                tab1[ j ] = rand() % n + 1;
                i = - 1;
            }
            else if( tab1[ j ] != tab2[ i ] && i >= n - 1 )
            {
                tab2[ j ] = tab1[ j ];
                break;
            }
        }
    }
    for( i = 0; i < n; i++ )
    {
        cout << tab2[ i ] << std::endl;
    }
}
//**********************

algorytm użyty bezpośrednio w funkcji main:
C/C++
#include <iostream>
#include <time.h>
#include <cstdlib>
using std::cout;
using std::cin;
int main()
{
    int tab1[ 18 ]; // tablica liczb pseudo-losowych
    int tab2[ 18 ]; // tablica liczb prawdziwie-losowych
    int i; int j = 0;
    srand( time( NULL ) );
    for( i = 0; i < 18; i++ )
    {
        tab1[ i ] = rand() % 18 + 1;
    }
   
    for( j = 0; j < 18; j++ )
    {
        for( i = - 1; i < 18; i++ )
        {
            if( tab1[ j ] == tab2[ i ] )
            {
                tab1[ j ] = rand() % 18 + 1;
                i = - 1;
            }
            else if( tab1[ j ] != tab2[ i ] && i >= 17 )
            {
                tab2[ j ] = tab1[ j ];
                break;
            }
        }
    }
    for( int i = 0; i < 18; i++ )
    {
        cout << tab2[ i ] << std::endl;
    }
    return 0;
}
P-175686
pekfos
» 2019-11-28 18:27:39
Przekraczasz zakres tablicy i tab2 nie jest zainicjalizowane.

liczby prawdziwie losowe
Niby jak? Nie masz w tym kodzie niczego co by było prawdziwie losowe. Przeciwnie, twój generator jest nawet bardziej przewidywalny niż rand().
P-175687
Lewy1607
Temat założony przez niniejszego użytkownika
» 2019-11-28 18:45:34
W jaki sposób przekraczam niby zakres tablicy skoro bezspośrednio w funkcji main ten algorytm działa jak należy? czyli losuje liczby z przedziału od 1 do 18 i nie powtarzają się one ani razu?.I niby jak nie zainicjalizowałem tab2 jak zrobiłem to przecież na samym początku funkcji main? ( chodzi mi o ten drugi kod ).
P-175688
Lewy1607
Temat założony przez niniejszego użytkownika
» 2019-11-28 18:51:10
Już nieważne - wiem w czym jest problem,w pętli zewnętrznej przekroczyłem zakres wykonywania pętli,bo powinien być on o 1 mniejszy niż ilość liczb w tablicy.Dziękuje za pomoc.Ale z tym niezainicjalizowaniem tab2 nadal nie wiem o co chodziło. Tak samo jak z tym,że - użyty algorytm w funkcji main działa dalej jak należy,a jak już go użyje w funkcji to się on sypie.
ironicznie gdy użyje kod z funkcji bezpośrednio w funkcji main to z kolei ostatni indeks tablicy się sypie.

Tutaj konkretne przykłady jeśli wyraziłem się niejasno ( bo sam nie mam pojęcia czemu tak się dzieje,a żadnego błędu nie widzę ).


algorytm użyty bezpośrednio w funkcji main:
C/C++
#include <iostream>
#include <time.h>
#include <cstdlib>
using std::cout;
using std::cin;
int main()
{
    int tab1[ 18 ]; // tablica liczb pseudo-losowych
    int tab2[ 18 ]; // tablica liczb prawdziwie-losowych
    int i; int j = 0;
    srand( time( NULL ) );
    for( i = 0; i < 18; i++ )
    {
        tab1[ i ] = rand() % 18 + 1;
    }
   
    for( j = 0; j < 18 - 1; j++ )
    {
        for( i = - 1; i < 18; i++ )
        {
            if( tab1[ j ] == tab2[ i ] )
            {
                tab1[ j ] = rand() % 18 + 1;
                i = - 1;
            }
            else if( tab1[ j ] != tab2[ i ] && i >= 18 - 1 )
            {
                tab2[ j ] = tab1[ j ];
                break;
            }
        }
    }
    for( int i = 0; i < 18; i++ )
    {
        cout << tab2[ i ] << std::endl;
    }
    return 0;
}

algorytm użyty w procedurze:
C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>
using std::cout;
using std::cin;
void true_rand( int n );

int main()
{
    true_rand( 18 );
    return 0;
}

void true_rand( int n )
{
    int tab1[ n ];
    int tab2[ n ];
    int i; int j = 0;
    srand( time( NULL ) );
    for( i = 0; i < n; i++ )
    {
        tab1[ i ] = rand() % n + 1;
    }
    for( j = 0; j < n - 1; j++ )
    {
        for( i = - 1; i < n; i++ )
        {
            if( tab1[ j ] == tab2[ i ] )
            {
                tab1[ j ] = rand() % n + 1;
                i = - 1;
            }
            else if( tab1[ j ] != tab2[ i ] && i >= n - 1 )
            {
                tab2[ j ] = tab1[ j ];
                break;
            }
        }
    }
    for( i = 0; i < n; i++ )
    {
        cout << tab2[ i ] << std::endl;
    }
}
P-175689
pekfos
» 2019-11-28 19:20:54
Przekraczasz zakres podając ujemny indeks.

Ale z tym niezainicjalizowaniem tab2 nadal nie wiem o co chodziło.
C/C++
int tab2[ n ]; // Nie nadajesz żadnych wartości
int i; int j = 0;
srand( time( NULL ) );
for( i = 0; i < n; i++ )
{
    tab1[ i ] = rand() % n + 1;
}
for( j = 0; j < n; j++ )
{
    for( i = - 1; i < n; i++ )
    {
        if( tab1[ j ] == tab2[ i ] ) // Użycie
P-175690
Lewy1607
Temat założony przez niniejszego użytkownika
» 2019-11-29 14:53:41
Rzeczywiście,musiałem przypisać do tab2 liczby,inaczej porównywałem liczby z adresami indeksów z tablicy.

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>
using std::cout;
using std::cin;
void true_rand( int n );
//***********************************************************************************************************************************************************************************************
int main()
{
    true_rand( 18 );
    return 0;
}
//***********************************************************************************************************************************************************************************************
void true_rand( int n )
{
    int tab1[ n ];
    int tab2[ n ];
    int i; int j = 0;
    srand( time( NULL ) );
    for( i = 0; i < n; i++ )
    {
        tab1[ i ] = rand() % n + 1;
    }
    for( i = n - 1; i >= 0; i-- )
    {
        tab2[ i ] = tab1[ n - 1 ];
    }
    for( j = 0; j < n - 1; j++ )
    {
        for( i = 0; i < n; i++ )
        {
            if( tab1[ j ] == tab2[ i ] )
            {
                tab1[ j ] = rand() % n + 1;
                i = - 1;
            }
            else if( tab1[ j ] != tab2[ i ] && i >= n - 1 )
            {
                tab2[ j ] = tab1[ j ];
                break;
            }
        }
    }
    for( i = 0; i < n; i++ )
    {
        cout << tab2[ i ] << std::endl;
    }
}
//***********************************************************************************************************************************************************************************************

Czy taki kod jest teraz prawidłowy? i czy przypisanie wartości i=-1 w pętli zgnieżdżonej, dalej powoduje przekroczeniu wartości? osobiście wydaje mi się że nie, bo po wykonaniu instrukcji if,pętla wykonuje instrukcję kroku "i" o 1 a więc pętla będzie się wtedy zaczynać znowu od 0. Czy dobrze Myślę?
P-175693
pekfos
» 2019-11-29 19:21:17
Przypisanie -1 jest w porządku, tylko nie możesz zaczynać od -1.

Czy taki kod jest teraz prawidłowy?
A co on w ogóle ma robić?
P-175694
Lewy1607
Temat założony przez niniejszego użytkownika
» 2019-11-30 09:26:51
A co on w ogóle ma robić?
Losować liczby z określonego z góry przedziału od "1" do przedziału wpisanego przez użytkownika,które się nie powtarzają,czyli na 10 liczb,wylosują się liczby z przedziału od 1 do 10 i żadna z nich nie powtórzy się raz,czyli każda z tego przedziału wystąpić ma raz w losowej kolejności.Wydaje mi się że działa dobrze ale wolałbym spytać kogoś bardziej doświadczonego tak dla pewności czy nic się w nim już nie sypie.
P-175695
« 1 » 2
  Strona 1 z 2 Następna strona