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

Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2014-01-26 19:35
Autor Wiadomość
Atexor
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń
» 2014-01-25 22:24:43
Witam, mam następujące zadanie:

Napisać program (w języku C)wyznaczający N kolejnych wyrazów następującego ciągu (począwszy od 3 wyrazu):
y(i)=b1*y(i-1)+b2*y(i-2) gdzie: y1 = 0.3; y2 = 0.7;
Następnie, wszystkie wyznaczone wyrazy należy zapisać do pliku tekstowego „wyniki.txt”. Ponadto program powinien zawierać funkcję, która będzie obliczać i zwracać do programu głównego sumę oraz iloczyn trzech różnych losowo wybranych wyrazów wyznaczonego ciągu.

Stworzyłem program, zapisuje wyrazy ciągu do pliku tekstowego, ale nie mam zielonego pojęcia jak zrobić sprawdzanie , czy dana liczba się już powtórzyła. Próbowałem już przez tablice, continue/break, if'y, w pętli do while, for itp. ale nie chciało działać. Teraz doszedłem do takiego momentu który przedstawię poniżej - losuje różne, ale trójkami, tak jak na screen'ie poniżej:
http://i.imgur.com/bBd0BKp.jpg
W tym przypadku losowanie powinno zakończyć od razu, gdy natrafi na 1, a nie robi tylko losuje dalej.

Kod za losowanie w końcu postanowiłem poszukać w internecie, ale większość jest w C++, a nawet w tych C nie za bardzo rozumiem. Czy mógłby mi ktoś podać jakiś prosty kod/wskazówki jak to zrobić, bo już siedzę nad tym z 2 godziny...

Poza tym - dlaczego wyniki mi zapisuje do pliku, mimo że zapomniałem dopisać fclose()? W kazdych innych programach co pisałem, plik był pusty, bo nie zapisano zmian.



Kod (nie przejmujcie się, że funkcja fun nic nie zwraca, bo program jest w wersji wczesna alpha :)).
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

float fun( float * tabf, int Nf )
{
    float suma, iloczyn, los, los1 = 0, los2 = 0, los3 = 0, ilpetli = 0;
    int j;
   
    for( j = 0; j < 3; j++ )
    {
        los = 1 + rand() % Nf;
        los3 = los2;
        los2 = los1;
        los1 = los;
        printf( "Wylosowana liczba %.f\n", los );
        ilpetli++;
        // printf("Liczba %d to %f",j,tabf[los]);
       
        if( ilpetli >= 2 &&( los1 == los2 || los2 == los3 || los1 == los3 ) )
        {
            j--;
        }
    }
   
    /*        do
            {
                los=1+rand()%Nf;
                los3=los2;
                los2=los1;
                los1=los;
                j=j+1;
                printf("Wylosowana liczba %.f\n",los);
               // printf("Liczba %d to %f",j,tabf[los]);
                if(los1!=los2 && los2!=los3 && los1!=los3 && j>=3)
                {
                 break;
                }
            }while(1);
        return(los1);*/
}

int main()
{
    FILE * plik;
    plik = fopen( "wyniki.txt", "wt" );
    float b1, b2, y1 = 0.3, y2 = 0.7, y = 0, wynik;
    int N, i;
    printf( "Podaj ilosc wyrazow N ciagu y[N]:\n" );
    scanf( "%d", & N );
    float tab[ N ];
    printf( "Podaj b1:\n" );
    scanf( "%f", & b1 );
    printf( "Podaj b2:\n" );
    scanf( "%f", & b2 );
    printf( "\n" );
    srand( time( NULL ) );
    if( N == 1 )
    {
        printf( "y[1]=0.3\n" );
        fprintf( plik, "y[1]=0.3\n" );
    }
    if( N == 2 )
    {
        printf( "y[1]=0.3\ny[2]=0.7\n" );
        fprintf( plik, "y[1]=0.3\ny[2]=0.7\n" );
    }
    for( i = 3; i <= N; i++ )
    {
        y = b1 * y2 + b2 * y1;
        y1 = y2;
        y2 = y;
        printf( "y[%d]=%f\n", i, y );
        fprintf( plik, "y[%d]=%f\n", i, y );
        tab[ i ] = y;
    }
   
    wynik = fun( tab, N );
   
    system( "PAUSE" );
    return 0;
}

Pozdrawiam

P-103201
Atexor
Temat założony przez niniejszego użytkownika
» 2014-01-26 19:35:34
EDIT:
Wszystko już działa, udało mi się naprawić wszystkie problemy. Kod dla potomnych jakby ktoś miał podobny problem:

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void fun( float * tabf, int Nf )
{
    float suma = 0.0, iloczyn = 1;
    int j, k;
    int los;
    int tabspr[ 3 ] = { 0, 0, 0 };
   
    for( k = 0; k < 3; k++ )
    {
        los = 3 + rand() %( Nf - 3 + 1 );
        tabspr[ k ] = los;
       
        if( k == 1 && tabspr[ k ] == tabspr[ k - 1 ] )
        {
            k--;
        }
       
        if( k == 2 &&( tabspr[ k ] == tabspr[ k - 1 ] || tabspr[ k ] == tabspr[ k - 2 ] ) )
        {
            k--;
        }
    }
   
    printf( "\nWylosowano nastepujace 3 losowe wyrazy:\n" );
    for( j = 0; j < 3; j++ )
    {
        printf( "tab[%d]=%f\n", tabspr[ j ], tabf[ tabspr[ j ] ] );
        suma = suma + tabf[ tabspr[ j ] ];
        iloczyn = iloczyn * tabf[ tabspr[ j ] ];
       
    }
    printf( "Suma to %f, a iloczyn %f\n", suma, iloczyn );
}

int main()
{
    FILE * plik;
    plik = fopen( "wyniki.txt", "wt" );
    float b1, b2, y1 = 0.3, y2 = 0.7, y = 0, wynik;
    int N, i;
    do
    {
        printf( "Podaj ilosc wyrazow N ciagu y[N]:\n" );
        scanf( "%d", & N );
        printf( "%d", N );
        if( N < 5 )
             printf( "N musi byc wieksze od 3 do losowania 3 losowych wyrazow!\n" );
       
    } while( N < 5 );
   
    float tab[ N ];
    printf( "Podaj b1:\n" );
    scanf( "%f", & b1 );
    printf( "Podaj b2:\n" );
    scanf( "%f", & b2 );
    printf( "\n" );
    srand( time( NULL ) );
    if( N == 1 )
    {
        printf( "y[1]=0.3\n" );
        fprintf( plik, "y[1]=0.3\n" );
    }
    if( N == 2 )
    {
        printf( "y[1]=0.3\ny[2]=0.7\n" );
        fprintf( plik, "y[1]=0.3\ny[2]=0.7\n" );
    }
    for( i = 3; i <= N; i++ )
    {
        y = b1 * y2 + b2 * y1;
        y1 = y2;
        y2 = y;
        printf( "y[%d]=%f\n", i, y );
        fprintf( plik, "y[%d]=%f\n", i, y );
        tab[ i ] = y;
    }
   
    fun( tab, N );
    printf( "\n" );
    system( "PAUSE" );
    return 0;
}
P-103278
« 1 »
  Strona 1 z 1