Program losuje liczby całkowite z przedziału <0,5> tak długo
aż wylosowane zostana wszystkie liczby z podanego przedziału.
Jak sie za to zabrac ?

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Losujesz liczbę 0-5. Zapisujesz ją do set<int> z wylosowanymi liczbami. Powtarzasz dopóki ten set ma mniej niż 6 elementów.
Nie rozumiem gdzie jest problem.


- Rejestracja:prawie 12 lat
- Ostatnio:około 10 godzin
#include <iostream>
#include <iterator>
#include <vector>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm/random_shuffle.hpp>
#include <boost/range/algorithm/copy.hpp>
int main(){
std::vector<int> data;
boost::copy(boost::irange(0, 6), std::back_inserter(data));
boost::random_shuffle(data);
boost::copy(data, std::ostream_iterator<int>(std::cout, " "));
}

- Rejestracja:ponad 9 lat
- Ostatnio:ponad 8 lat
- Postów:93
Bez boosta:
#include <iostream>
#include <algorithm>
#include <random>
#include <vector>
#include <iterator>
using namespace std;
int main() {
std::vector<int> numbers(6);
std::iota(numbers.begin(), numbers.end(), 0);
std::shuffle(numbers.begin(), numbers.end(), std::mt19937{std::random_device{}()});
std::copy(numbers.cbegin(), numbers.cend(), std::ostream_iterator<int>(std::cout, " "));
return 0;
}

- Rejestracja:prawie 12 lat
- Ostatnio:około 10 godzin
Mały Lew napisał(a):
Nie da się "prościej" tego zrobić używając tablic ?
Ależ oczywiście, proszę bardzo z tablicą
#include <iostream>
#include <iterator>
#include <vector>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm/random_shuffle.hpp>
#include <boost/range/algorithm/copy.hpp>
int main(){
int data[6];
boost::copy(boost::irange(0, 6), std::begin(data));
boost::random_shuffle(data);
boost::copy(data, std::ostream_iterator<int>(std::cout, " "));
}

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Ale te wszystkie wasze propozycje chyba nie są poprawne, bo autor wcale nie powiedział że chce permutować sobie <0,5> tylko że chce losować wielokrotnie aż się wszystkie liczby nie pojawią...

- Rejestracja:ponad 12 lat
- Ostatnio:19 dni
- Lokalizacja:Kraków
- Postów:1055
#include <iostream>
#include <cstdlib>
using namespace std;
bool czy_wszystkie_wylosowane (bool *tablica, size_t rozmiar_tablicy) {
for (size_t i = 0; i < rozmiar_tablicy; ++i) {
if (tablica[i] == false)
return false;
}
return true;
}
int losuj_liczbe() {
return rand() % 6;
}
int main() {
constexpr size_t rozmiar = 6;
bool tablica[rozmiar];
for (size_t i = 0; i < rozmiar; ++i)
tablica[i] = false; // false oznacza, ze liczba nie byla do tej pory wylosowana
while (!czy_wszystkie_wylosowane(tablica, rozmiar)) {
int wylosowana_liczba = losuj_liczbe();
cout << "wylosowano " << wylosowana_liczba << endl;
tablica[wylosowana_liczba] = true;
}
return 0;
}
Zawsze śmieszy mnie, jak autor zadaje trywialne, podstawowe pytanie a wy rzucacie mu tego typu kody... set<int>
jest najlepszym rozwiązaniem, ale strzelam, że gdyby autor potrafił używać stl + template to nie pytałby o takie rzeczy. Więc proszę - najprostszy możliwy kod.

-std=c++11



- Rejestracja:prawie 10 lat
- Ostatnio:około 15 godzin
- Lokalizacja:Tam gdzie jest (centy)metro...
Jeśli nie set<...> i nie pasuje C++11, to można i tak... bitami i "szkolnie" :-)
#include <iostream>
#include <cstdlib>
#include <ctime>
// Inicjalizacja generatora liczb losowych z zasiewem opartym o czas
void init_random() {
std::srand(std::time(NULL));
}
unsigned get_rand_value() {
// Losuje liczby z przedziału [0,5] jak chciałeś...
return std::rand() % 6;
}
int main() {
using namespace std;
// Zmienna sterująca pętlą
unsigned check = 0;
// Stała sterująca zatrzymaniem pętli
// To będą zapalone wszystkie bity na pozycji wylosowanej liczby
// ... oczywiście 63 ale zapisane abyś zrozumiał :-)
static const unsigned STOP_VALUE = (1 << 6) - 1;
// Wartość wylosowana.
unsigned value;
// Inicjalizacja generatora liczb losowych
init_random();
// Pętla losowań liczb
do {
value = get_rand_value();
// Zapalenie bitu danej liczby losowej
check |= 1 << value;
std::cout << value << std::endl;
} while(check != STOP_VALUE);
}


constexpr
Cię przeraża, to podstaw tam sobie const
, też będzie fajnie i w najstarszym możliwym C++ to skompilujesz