Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Unshuffle

Brebl [11.06.2019 15:36:55]

#

Heippa

Tarkoituksena olisi shufflen jälkeen saada "unshuffle" aikaiseksi, mutta ei toimi.
Missä vika?

#include <iostream>
#include <algorithm>    // std::shuffle, std::reverse
#include <random>       // std::default_random_engine
#include <vector>		// std::vector

int main()
{
	//Siemen
	unsigned siemen = 10;
	std::default_random_engine generator;
	generator.seed(siemen);

	//Taulukon muodostus
	std::vector<int> taulukko;
	int i, j;
	for(i = 0; i < 10; i++)
	for(j = 0; j < 10; j++)
		taulukko.emplace_back(j);

	//Tulostus
	std::cout << "Elements:" << std::endl;
	j = 0;
	for(int i: taulukko){
		std::cout << i;
		j++;
		if(j==10) {
			std::cout << std::endl;
			j = 0;
		}
	}
	std::cout << std::endl;

	//Suffle
	shuffle(taulukko.begin(), taulukko.end(), generator);

	//Tulostus
	std::cout << "shuffled elements:" << std::endl;
	j = 0;
	for(int i: taulukko){
		std::cout << i;
		j++;
		if(j==10) {
			std::cout << std::endl;
			j = 0;
		}
	}
	std::cout << std::endl;

	//Uudelleen siemennys
	generator.seed(siemen);

	//Unsuffle
	std::reverse(taulukko.begin(),taulukko.end());
	shuffle(taulukko.begin(), taulukko.end(), generator);

	//Tulostus
	std::cout << "Unshuffled elements:" << std::endl;
	j = 0;
	for(int i: taulukko){
		std::cout << i;
		j++;
		if(j==10) {
			std::cout << std::endl;
			j = 0;
		}
	}
}

Metabolix [11.06.2019 15:51:59]

#

Shufflen ”vastakohta” on sort.

Nykyinen lähestymistapasi on selvästi virheellinen: Jos taulukko 012345 sekoitetaan niin, että järjestykseksi tulee 105324, tämä käännettynä on 423501, ja kun tämä sekoitetaan uudestaan samalla tavalla, saadaan 241530, ei suinkaan alkuperäistä järjestystä.

012345 vs. 423501
105324 vs. 241530

sekoitus:
u[0] = t[1] = 2
u[1] = t[0] = 4
u[2] = t[5] = 1
u[3] = t[3] = 5
u[4] = t[2] = 3
u[5] = t[4] = 0

Siis sekoitat taulukon, käännät sen ja sekoitat vielä lisää. Taulukon kääntäminen ympäri ei tarkoita sitä, että shufflessa tapahtuvat siirrot tehtäisiin ajallisesti käänteisessä järjestyksessä. Tätä varten pitäisi tuntea shufflen käyttämä algoritmi, ottaa talteen siihen liittyvät satunnaisluvut ja toteuttaa algoritmi käänteisessä järjestyksessä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta