Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Losowe przypisywanie wartosci bez powtarzania? Visual C++ 2005.

#1
Losowe przypisywanie wartosci bez powtarzania? Visual C++ 2005.
Czy jest w Visualu C++ 2005 jakas funkcja która losowo przypisuje wartosci ale bez ich powtarzania.
Mam bowiem problem bo urzywam funkcji rand()% i napisalem sobie jeszcze troche kodu do tej funkcji aby wlasnie uniknac powtarzania sie wartosci.

Oto moj program z ...Doc.cpp:
Kod:
CKartyDoc::CKartyDoc()
{
    char *T="AKDWERTGBX";
    int x1=20,y1=50,x2=100,y2=200;
    char typ;
    bool Ok;
    for(int i=0;i<10;i++)
    {
        do{
        Ok=false;
        typ=T[rand()%10];
        for(int j=0;Karta[j]==NULL && j<10;j++)
            if(Karta[j]->typ==typ)
                Ok=true;
        }
        while(Ok);

    Karta[i]=new CMemo(x1,y1,x2,y2,typ);
    x1+=90;
    x2+=90;
    }
    x1=20;x2=100;
    for(int i=0;i<10;i++)
    {
        do{
        Ok=false;
        typ=T[rand()%10];
        for(int j=0;Karta[j]==NULL && j<10;j++)
            if(Karta[j]->typ==typ)
                Ok=true;
        }
        while(Ok);

    Karta1[i]=new CMemo(x1,y1+200,x2,y2+200,typ);
    x1+=90;
    x2+=90;
    }
Nie mam pojęcia czy jest jakis sposob na prostsze tego zapisanie :?:
Za wszelka pomoc z gory dziekuje Wesoły
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#2
RE: Losowe przypisywanie wartosci bez powtarzania? Visual C++ 2005.
~Anonim napisał(a):Czy jest w Visualu C++ 2005 jakas funkcja która losowo przypisuje wartosci ale bez ich powtarzania.

Z tego co wiem to nie ma czegoś takiego, jest tylko random, żeby wyniki sie nie powtarzały musisz zrobić zbiornik losowanych elementów i odejmować od niego wylosowany element, w ten sposób losujesz jeszcze nie wylosowane elementy
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#3
RE: Losowe przypisywanie wartosci bez powtarzania? Visual C++ 2005.
crayze a moglbys mi pokazac jak to mniej wiecej ma wygladac? Wesoły
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#4
RE: Losowe przypisywanie wartosci bez powtarzania? Visual C++ 2005.
Do takiej operacji użyłem "vectora", ale można użyć innych zbiorników, zakładam, że znasz klasę vector:

Kod:
#include <iostream>
#include <vector>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
  vector<int> zbiornik;//zbiornik z losowanymi wartościami, narazie pusty
  cout<<"Z ilu wartosci ma sie skladac zbiornik?\n";
  int ile;
  cin>>ile;
  cout<<"LOSOWANIE:?\n\n\n";
  //wypełnianie zbiornika kolejnymi liczbami, których będzie "ile"
  for(int i=0;i<ile;i++) zbiornik.push_back(i+1);
  //mając zbiornik możemy już losować z nieg liczby i je wyświetlać
  //ale najpierw incjacja jądra liczb losowych
  SYSTEMTIME st;
  GetSystemTime(&st);
  srand(st.wSecond*st.wMinute*st.wHour);//inicjacja jądra czasem z systemowym
  //poprostu nie pmaietam jak uzyskać czas funckajmi C++, to użyłem WinAPI
  //teraz już możemy lsoować kolejne liczby ze zbiornika
  for(int i=0;i<ile;i++)
  {
    int index=rand()%zbiornik.size();//losujemy liczbę, końcem przedziału jest długość zbiornika
    cout<<zbiornik[index]<<endl;//wyświetlamy wylosowaną wartość
    //no i usuwamy ją ze zbiornika, żeby jej ponownie nie wylosować, wielkość zbiornika zmaleje o 1
    vector<int>::iterator iter=zbiornik.begin()+=index;
    zbiornik.erase(iter);
  }
  system("PAUSE");
  return EXIT_SUCCESS;
}

EDIT: program losuje liczby, mu na początku podajmy wielkość z jakiej ma losować, każda liczba zostanie wylosowana tylko raz
EDIT2: zauważ, że w ostatnim obiegu pętli losującej, zostanie już tylko 1 element w vectorze, więc metoda size zwróci 1, a więc rand będzie mógł wylosować tylko 0
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
Programy: Polecane / Nowe / Inne



Użytkownicy forum szukali:
powtarzanie losowych liczb c++

Podobne wątki (Losowe przypisywanie wartosci bez powtarzania? Visual C++ 2005.)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Visual Studio Code- zmiana folderu rozszerzeń Physicist 4 15744 05.04.2020, 15:46
Ostatni post: Physicist
  Transfer plików via FTP Visual Basic FireBytes 3 8167 15.08.2019, 07:41
Ostatni post: Szachista
  Visual Basic Excel l.całkowitą przedstawić w postaci szesnastkowej fugaz 4 16936 18.06.2019, 21:36
Ostatni post: fugaz

Skocz do: