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.