Losowanie niepowtarzających się liczb w C++Builder6
Losowanie niepowtarzających się liczb w C++Builder 6 można zrealizować na kilka sposobów, wykorzystując różne struktury danych i algorytmy. Poniżej przedstawiam kompleksowe rozwiązanie, które jest efektywne i łatwe do zaimplementowania.
Aby losować niepowtarzające się liczby w C++Builder 6, można użyć klasy std::vector
do przechowywania liczb oraz funkcji std::random_shuffle
do ich przetasowania. Alternatywnie, można użyć klasy std::set
do przechowywania unikalnych liczb. Poniżej przedstawiam szczegółowe przykłady obu podejść.
Generowanie losowych liczb:
rand()
do generowania losowych liczb.srand(time(NULL))
.Przechowywanie unikalnych liczb:
std::vector
i sprawdzanie, czy liczba już istnieje.std::set
, który automatycznie przechowuje unikalne elementy.Przetasowanie liczb:
std::random_shuffle
do przetasowania wektora liczb.std::vector
i std::random_shuffle
#include <vcl.h>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#pragma hdrstop
#pragma argsused
#include <tchar.h>
#include <iostream>
void shuffleVector(std::vector<int>& vec) {
std::srand(static_cast<unsigned int>(std::time(0)));
std::random_shuffle(vec.begin(), vec.end());
}
std::vector<int> generateUniqueRandomNumbers(int min, int max, int count) {
std::vector<int> numbers;
for (int i = min; i <= max; ++i) {
numbers.push_back(i);
}
shuffleVector(numbers);
std::vector<int> randomNumbers(numbers.begin(), numbers.begin() + count);
return randomNumbers;
}
int _tmain(int argc, _TCHAR* argv[]) {
int min = 1;
int max = 100;
int count = 10;
if (count > (max - min + 1)) {
std::cerr << "Count is larger than the range of available numbers." << std::endl;
return 1;
}
std::vector<int> randomNumbers = generateUniqueRandomNumbers(min, max, count);
std::cout << "Wylosowane niepowtarzające się liczby: ";
for (int number : randomNumbers) {
std::cout << number << " ";
}
std::cout << std::endl;
return 0;
}
std::set
#include <vcl.h>
#include <set>
#include <ctime>
#include <cstdlib>
#include <iostream>
#pragma hdrstop
#pragma argsused
#include <tchar.h>
std::set<int> generateUniqueRandomNumbers(int min, int max, int count) {
std::set<int> numbers;
std::srand(static_cast<unsigned int>(std::time(0)));
while (numbers.size() < count) {
int randomNumber = std::rand() % (max - min + 1) + min;
numbers.insert(randomNumber);
}
return numbers;
}
int _tmain(int argc, _TCHAR* argv[]) {
int min = 1;
int max = 100;
int count = 10;
if (count > (max - min + 1)) {
std::cerr << "Count is larger than the range of available numbers." << std::endl;
return 1;
}
std::set<int> randomNumbers = generateUniqueRandomNumbers(min, max, count);
std::cout << "Wylosowane niepowtarzające się liczby: ";
for (int number : randomNumbers) {
std::cout << number << " ";
}
std::cout << std::endl;
return 0;
}
Inicjalizacja generatora liczb losowych:
std::srand(static_cast<unsigned int>(std::time(0)));
inicjalizuje generator liczb losowych, co zapewnia różne wyniki przy każdym uruchomieniu programu.Przetasowanie wektora:
std::random_shuffle(numbers.begin(), numbers.end());
tasuje elementy wektora w sposób losowy.Sprawdzanie unikalności:
std::vector
, używamy std::find
do sprawdzenia, czy liczba już istnieje.std::set
automatycznie przechowuje unikalne elementy, co upraszcza kod.std::set
może być bardziej efektywna dla dużych zbiorów liczb, ponieważ operacje wstawiania i sprawdzania unikalności są wykonywane w czasie logarytmicznym.count
jest mniejsza lub równa zakresowi [min, max]
, aby uniknąć nieskończonej pętli.Obie metody przedstawione powyżej są efektywne i gwarantują losowanie unikalnych liczb. Wybór metody zależy od specyfiki problemu i preferencji programisty. Metoda z std::vector
i std::random_shuffle
jest prostsza w implementacji, podczas gdy metoda z std::set
może być bardziej efektywna dla dużych zbiorów liczb.