Shuffle() versus random_shuffle() in C++

Shuffle Versus Random Shuffle In C



In C++ biedt de standaardbibliotheek twee functies, schudden() En willekeurige_shuffle() die worden gebruikt om de elementen van een container te herschikken. Hoewel beide functies hetzelfde doel dienen, verschillen ze in hun implementatie en de manier waarop ze willekeurige getallen genereren.

In dit artikel vindt u de verschillen tussen deze twee functies en begrijpt u hoe ze werken.

shuffle() in C++

De schudden() function is een ingebouwde C++-functie die wordt gebruikt om de elementen in een bepaald bereik willekeurig door elkaar te schudden of te herschikken. De functie wordt gedeclareerd in de header-bestand en heeft twee argumenten: de beginpositie van het bereik is het eerste argument en het tweede argument vertegenwoordigt de eindpositie.







Daarnaast is er ook een optionele derde parameter nodig, een functieobject dat willekeurige getallen genereert die worden gebruikt om de elementen in het bereik door elkaar te schudden.



Wanneer de schudden() functie wordt aangeroepen, herschikt het willekeurig de elementen in het opgegeven bereik met behulp van de meegeleverde generator voor willekeurige getallen. Het resultaat van de shuffle is niet voorspelbaar, en elke mogelijke permutatie van de elementen is even waarschijnlijk.



Voorbeeld

Beschouw het onderstaande voorbeeld van het gebruik van de shuffle() functie in C++. In dit programma hebben we de vector gemaakt een ding met de gehele waarden van 0 tot 10. Vervolgens genereren we een generator voor willekeurige getallen, die vervolgens samen met het bereik van de vector wordt doorgegeven aan de schudden() functie. De schudden() functie neemt het nummer en verwisselt de elementen op basis van dit nummer. Vervolgens hebben we de herschikte vectorreeks afgedrukt met behulp van de for-lus





#include

#include

#include

#include

#include

namespace std; gebruiken ;

int voornaamst ( )

{

vector < int > een ding { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;

ongetekend zaad = chronograaf :: systeem klok :: nu ( ) . time_sinds_epoch ( ) . graaf ( ) ;

schudden ( een ding. beginnen ( ) , een ding. einde ( ) , default_random_engine ( zaad ) ) ;

cout << 'geschudde elementen zijn:' ;

voor ( int & i : een ding )

cout << '' << i ;

cout << eindel ;

opbrengst 0 ;

}

random_shuffle() in C++

De willekeurige_shuffle() functie herschikt ook willekeurig de elementen in het gegeven bereik met een willekeurig gekozen nummer. Het gebruikt een generator voor willekeurige getallen om een ​​reeks willekeurige getallen te genereren en gebruikt die getallen vervolgens om de elementen in het bereik door elkaar te schudden, zodat de volgorde van het programma elke keer dat u het programma uitvoert, anders zal zijn.



Er zijn twee parameters vereist voor willekeurige_shuffle() : de startpositie van het bereik is de eerste parameter en de tweede parameter is de eindpositie. Aanvullend, willekeurige_shuffle() kan een optionele derde parameter hebben, wat een functieobject is dat kan worden gebruikt om de willekeurige getallen te genereren voor het door elkaar schudden van de elementen.

Voorbeeld

Het onderstaande voorbeeld illustreert de werking van de willekeurige_shuffle() in C++. In deze code hebben we een vector ding met gehele getallen van 1 tot 10 en gebruikte vervolgens de for loop om de willekeurig geschudde reeks af te drukken:

#include

#include

namespace std; gebruiken ;

int voornaamst ( )

{

vector < int > een ding { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;

zand ( statische_cast < ongetekend int > ( tijd ( nulptr ) ) ) ;

willekeurige_shuffle ( een ding. beginnen ( ) , een ding. einde ( ) ) ;

voor ( int i : een ding ) {

cout << i << ' ' ;

}

cout << ' \N ' ;



opbrengst 0 ;

}

Verschil tussen shuffle() en random_shuffle()

Hier zijn de belangrijkste verschillen tussen schudden() En willekeurige_shuffle() functies in C++.

1: willekeurige_shuffle() neemt een paar iterators die het bereik van elementen vertegenwoordigen om in willekeurige volgorde te worden gebruikt, terwijl schudden() neemt een paar iterators die het bereik van elementen vertegenwoordigen om te schudden, evenals een generator voor willekeurige getallen om te gebruiken voor het schudden.

2: willekeurige_shuffle() is over het algemeen minder efficiënt dan schudden() , omdat het een reeks willekeurige getallen moet genereren om te gebruiken voor het schudden.

3: random_shuffle() gebruikt de interne implementatie van de generator voor willekeurige getallen in de C++ Standard Library om de elementen door elkaar te schudden, terwijl schudden() stelt je in staat om je eigen generator voor willekeurige getallen te specificeren om te gebruiken voor het schudden, waardoor je meer controle hebt over de willekeur van het schudden.

4: random_shuffle() werd geïntroduceerd in C++98 en wordt ondersteund door alle versies van de C++ Standard Library, terwijl schudden() werd geïntroduceerd in C++11 en wordt alleen ondersteund door compilers die die versie van de standaard implementeren.

Laatste gedachten

De keuze tussen schudden() En willekeurige_shuffle() hangt af van uw specifieke gebruikssituatie en vereisten. Als je meer controle nodig hebt over de willekeur van het schudden, of als je een aangepaste generator voor willekeurige getallen wilt gebruiken, dan schudden() zou een betere keuze zijn. Aan de andere kant, als je dat niveau van controle niet nodig hebt en gewoon een eenvoudige manier wilt om elementen door elkaar te schudden, dan willekeurige_shuffle() zou voldoende kunnen zijn.