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; } } }
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.