Visual C++ 2005 Losowe przypisywanie wartości!

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 :

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 :slight_smile:

Nie do końca rozumiem wklejony kod, ale chyba jest najprostszy. Można go przyspieszyć, ale przy tak małej ilości danych, nie da to dużego efektu.

No to moze sprubuje troche inaczej?

Załóżmy ze mam tablice wartosci:

char *A="'200','110','200','290','380','470','560','650','740','830'";

i chcialbym je przypisac losowo pod zmienna int x; ale bez powtarzania sie!

Moglby mi ktos podpowiedziec jak to zrobic? :slight_smile:

Gdybyś miał jeszcze tablice a nie srting… Powinno być:

int A[]={ 200,110,200,290,380,470,560,650,740,830 };

Jak chcesz przypisać raz jedną wartość, to nic nie musisz robić. Masz pewność, że będzie losowa :wink: Ale jeśli chcesz przypisać kilka razy bez powtarzania się, to musisz zapisywać sobie gdzieś wylosowane wartości. Ja bym dodał tablicę bool’i ustawioną na false(wszystkie elementy) i po losowaniu sprawdzał, czy aby dany element nie był już wylosowany. Np.:

int A[10] = { 200,110,200,290,380,470,560,650,740,830 };

bool B[10] = { false }; //Nie jestem pewien czy zadziała ;)

int x = 0;

for(int i = 0; i < 10; i++)

{

   do

   {

      x = rand()%10;

   }

   while(B[x] == false);

   B[x] = true;

   x = A[x];

   cout << x << endl;

}

Też stanąłem przed takim problemem niedawno. Tablica boolowska to jest jakieś rozwiązanie. Trzeba by to było jeszcze zabezpieczyć przed nieskończoną pętlą. Trzeba by było jeszcze sprawdzić czy są wolne miejsca, coś w stylu:

bool b[10] = {true, true, true, true, true, true, true, true, true, true}; // true czyli można brać z tego indeksu


	bool can = false // czy nie ma obaw przed nieskońćzoną pętlą, przed sprawdzaniem ustawić na false

	for(int i = 0; i < 10; i++) can = (can || b[i]);

Probowalem wskazowek ktore napisaliscie i cos za bardzo nie chce dzialac:( Program albo sie zawiesza a jak juz losuje to liczby

sie powtarzaja:( Nie wiem juz jak mam to zapisac? Moglibyscie to sprawdzic u siebie na kompilatorach, i powiedziec mi ewentualnie gdzie tkwi blad?

Z gory dzieki za wszelka pomoc :slight_smile:

Zrobiłem coś takiego…

#include 


using namespace std;


void printArr(int* wskarr, int rozm) {

	cout << "int[]: ";

	for (int i = 0; i < rozm; ++i) {

		cout << wskarr[i] << ", ";

	}

	cout << endl;

}


void printArr(bool* wskarr, int rozm) {

	cout << "bool[]: " << boolalpha;

	for (int i = 0; i < rozm; ++i) {

		cout << wskarr[i] << ", ";

	}

	cout << endl << noboolalpha;

}


int main() {

	const int ROZM = 10;

	int tabA[ROZM] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

	bool b[ROZM] = {true, true, true, true, true, true, true, true, true, true};

	bool can = true;


		while(can) {

			int indx = 0;

			do {

				can = false;

				for(int i = 0; i < ROZM; i++) can = (can || b[i]);

				if(!can) break;

				indx = rand() % ROZM;

			} while(!b[indx]);


			b[indx] = false;

			printArr(tabA, ROZM);

			printArr(b, ROZM);

			cout << "Wylosowałem: " << tabA[indx] << endl;

		}


		cout << "\nNie ma już więcej liczb do wylosowania" << endl;

}

Jest tylko jeden szkopuł. Jeżeli w tablicy tabA wartości mogą się powtarzać, a w wynikowej nie, to ten mechanizm na nic się zda bo mnie gwarantuje unikalności wartości, tylko indeksów.

Kurcze :-x

Nie wiem czemu ale jak napisze ten kod np. w Dev C++ to wszystko jest ok :slight_smile: ale jak juz chcem to umiescic w visualu i skompilowac moj projekt to visual lapie zawieche i nie chce skompilowac do konca :frowning: Musze za kazdym razem przerywac debugowanie :frowning:

Widocznie masz źle zainstalowanego Visual’a, albo w programie jest błąd(z tego co się orientuje MinGW w Dev-C++ jest bardzo stary).

Nie juz poprawilem:) Juz jest prawie wszystko ok:D Ale jest maly problem:( Rzeczywiscie ten kod wybiera liczby losowo i tylko jeden raz ale za kazdym razem pojawiaja sie one w tej samej kolejnosci:(

Co moze byc przyczyna takiego losowania?

Dodaj na początku kodu: srand(0)

No tak to srand(0); zmienia kolejnosc wylosowania ale tylko raz potem juz zostaje to samo :frowning:

Probowalem juz nawet w taki sposob i tez nie dalo to efektu :frowning: :

int los;

los=rand()%9;

srand(los);

Caly czas dochodzi do jednej zmiany a po ponownej kompilacji pozostaje to samo :frowning:

srand(time(NULL)) - co sekundę będzie inny :slight_smile:

Nie ale ja nie chce aby byl co sekunde inny tylko aby zmiana nastapila po ponownej kompilacji :slight_smile:

Jeżeli chcesz, aby zmiana argumentu srand odbywała się tylko podczas kompilacji, to przychodzi mi do głowy wykorzystanie __TIME__.

static_cast(string(__TIME__)[7])

[code]

Da kod ASCII ósmej litery ciągu __TIME__, jednak będzie to zawsze liczba od 48 do 57, jeżeli chcesz mieć liczby z większego przedziału możesz pokombinować wartościami 0, 1, 3, 4, 6 i 7 litery C-stringu __TIME__, który jest w formacie “hh:mm:ss”.