c++ losowanie

0

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 ?

3

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.

2
#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, " "));
}

http://melpon.org/wandbox/permlink/BkHDVlXg2p1ekdqZ

0

set<int>
tzn?

0

Nie da się "prościej" tego zrobić używając tablic ?

1

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;
}
0
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, " "));
}

http://melpon.org/wandbox/permlink/yWNEmJ2W8qkeTZAe

3

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ą...

2
#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.

1

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);
}
0

dzięki pingwindyktator

1 użytkowników online, w tym zalogowanych: 0, gości: 1