Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C++]Generator liczb bez powtórzeń

mckmi 10 Mar 2008 14:13 10681 9
  • #1
    mckmi
    Level 13  
    Witam
    Chciałbym napisac generator liczb bez powtórzeń. Jenak nie wiem jak pozbyć się powtórek.



    Code:

    #include <iostream>
    #include <fstream>
    using namespace std;

    int main()
    {
        fstream plik;
        plik.open("C:\\mozliwosci.txt", ios::out | ios::trunc);
        const int mx = 49;
        for(int a=1;a<=mx;a++)
        {     
          cout << a << "\t";
          for(int b=2;b<=mx;b++)
          {         
                if(a==b) continue;
                for(int c=3;c<=mx;c++)
                {
                    if(a==c) continue;
                    if(c==b) continue;
                     for(int d=4;d<=mx;d++)
                     {
                         if(a==d) continue;
                         if(b==d) continue;
                         if(c==d) continue;
                         for(int e=5;e<=mx;e++)
                         {
                            if(a==e) continue;
                            if(b==e) continue;
                            if(c==e) continue;
                            if(d==e) continue;
                            for(int f=6;f<=mx;f++)
                            {
                                if(a==f) continue;
                                if(b==f) continue;
                                if(c==f) continue;
                                if(d==f) continue;
                                if(e==f) continue;
                                plik << a << " " << b << " " <<  c << " "
                                << d << " " << e << " " << f << endl;
                               
                            }   
                         }
                     }     
                }
          }   
        }
       
        plik.close();
        return 0;
    }
  • #2
    jakubw
    Level 18  
    dziwne podejście do sprawy
    wstawiaj sobie gdzies te liczby

    blokowo

    deklaracja wektora gdzies na początek
    teoretyczny rozmiar to ilosc losowan
    a praktyczny niewiadomy bo to zalezy
    od ilosci powtórzen

    for a=1 to ilosc_losowań

    liczba= losuj

    for i=0 to wielkosc wektora przeszukaj wektor
    if ( liczba == liczba_w_wektorze)
    {
    wyjdz z pętli
    }
    else
    {
    wstaw do wektora
    }
    koniec petli for(2)
    koniec petli for(1)

    ewentualne wyplucie wektora do pliku
    oczywiscie kolejna petla
  • #3
    Akane
    Level 27  
    Jeśli ilość losowań może być potęgą dwójki minus jeden, to zainteresuj się rejestrem liniowym (Linear feedback shift register). Ma on tę zaletę, że wygenerowane nim liczby powtarzają się dopiero co pełen okres (2^n)-1, ma też jeden stan zabroniony - same zera, lub same jedynki, zależnie czy wynikowy xor jest negowany czy nie.
    Sprzężenie zwrotne to xor dwóch lub czterech bitów.

    Dodatkową zaletą jest to, że że doskonale nadaje się jako dzielnik częstotliwości w układach cyfrowych.

    http://en.wikipedia.org/wiki/Linear_feedback_shift_register
  • #4
    gacolini
    Level 19  
    Kiedyś na jakieś zaliczenie pisałem takie coś:
    Code:
    // Losowanie bez powtórzeń
    

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    void main()
    {
        int talia[23],i,j,los;
        clrscr();
        randomize();
        for(i=0;i<23;i++)
        {
            los=random(23)+1;//losujemy liczbę od 1 do 23
            for(j=0;j<23;j++)//sprawdzamy czy liczba nie powtarza się
                if(talia[j]==los) los=0;
            if(los>0) talia[i]=los;//nie powtarza się - przypisanie do tablicy
            else i--;//powtarza się - cofnij pętlę o 1
        }
        //wyświetlenie całej tali
        for(i=0;i<23;i++)
            printf("\ntalia[%d] = %d",i,talia[i]);
        getch();
    }


    Pozdrawiam
  • #5
    mckmi
    Level 13  
    Nie wiem czemu chcecie uzywac tutaj liczb losowych. Ja nie chcę losować liczb tylko wygenerowac wszystkie mozliwe kombinacje liczb od 1 do 49. Czyli np:
    1,2,3,4,5,6
    1,2,3,4,5,7
    1,2,3,4,5,8
    i teraz chcialbym sie pozbyc powtórek typu
    1,2,3,4,5,6
    1,2,3,4,6,5
  • #6
    User removed account
    User removed account  
  • #7
    mckmi
    Level 13  
    Nie chcę liczb losowych !
    chcę poprostu wygenerować wszystkie mozliwości jakie mogą istnieć podstawiajac liczby od 1 do 49.

    Liczby losowe są mi tu zbędne!
  • #8
    User removed account
    User removed account  
  • Helpful post
    #9
    maciek_slon
    Level 29  
    Można zrobić generowanie w pętlach w postaci:

    Code:
    for (int a=1; a<=49; a++)
    
      for (int b=a+1; b<=49; b++)
        for (int c=b+1; c<=49; c++)
          printf("%d %d %d", a, b, c);


    Wygeneruje wszystkie trzycyfrowe ciągi bez powtórzeń od 1 do 49 (o ile się nei pomyliłem, bo pisałem to na szybko)