Uso de la función STL de random_shuffle en Visual C++

En este artículo se describe cómo usar la random_shuffle función Biblioteca de plantillas estándar (STL) en Visual C++.

Versión original del producto: Visual C++
Número de KB original: 156994

Encabezado obligatorio

<algorithm>

Prototipo

template<class RandomAccessIterator, class Predicate> inline
void random_shuffle(RandomAccessIterator first,
                    RandomAccessIterator last,
                    Predicate pred)

Nota:

Los nombres de clase o parámetro del prototipo no coinciden con la versión original del archivo de encabezado. Se han modificado para mejorar la legibilidad.

Descripción

El random_shuffle algoritmo ordena de forma aleatoria los elementos de una secuencia (en primer lugar. último) en un orden aleatorio.

La versión del predicado usa la función previa para generar los índices de los elementos que se van a intercambiar. El pred tiene que ser un objeto de función que toma un parámetro n y devuelve un número aleatorio entero en el intervalo de 0 a (n - 1).

La versión de predicado de random_shuffle usa operator= para realizar intercambios.

Código de ejemplo

//////////////////////////////////////////////////////////////////////
// Compile options needed: /GX
// random_shuffle.cpp: Illustrates how to use the predicate version
//                      of the random_shuffle function.
// Functions:
//    random_shuffle: Shuffle the elements in a random order.
//     Rand: Given n, generates an integral random number in the
//          in the range 0 - (n - 1).
// of Microsoft Product Support Services,
// Software Core Developer Support.
// Copyright (c) 1996 Microsoft Corporation. All rights reserved.
//////////////////////////////////////////////////////////////////////

// disable warning C4786: symbol greater than 255 character,
// okay to ignore
#pragma warning(disable: 4786)

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

// return an integral random number in the range 0 - (n - 1)
int Rand(int n)
{
    return rand() % n ;
}

void main()
{
    const int VECTOR_SIZE = 8 ;

    // Define a template class vector of int
    typedef vector<int, allocator<int> > IntVector;

    //Define an iterator for template class vector of strings
    typedef IntVector::iterator IntVectorIt;
    IntVector Numbers(VECTOR_SIZE);
    IntVectorIt start, end, it;

    // Initialize vector Numbers
    Numbers[0] = 4;
    Numbers[1] = 10;
    Numbers[2] = 70;
    Numbers[3] = 30;
    Numbers[4] = 10;
    Numbers[5] = 69;
    Numbers[6] = 96;
    Numbers[7] = 100;

    start = Numbers.begin();   // location of first
                                // element of Numbers
    end = Numbers.end();       // one past the location
                                // last element of Numbers
    cout << "Before calling random_shuffle:\n" << endl;

    // print content of Numbers
    cout << "Numbers { ";
    for(it = start; it != end; it++)
        cout << *it << " ";
    cout << " }\n" << endl;

    // shuffle the elements in a random order.
    // the pointer_to_unary_function adapter converts a function to a
    // function object.
    random_shuffle(start, end, pointer_to_unary_function<int, int>(Rand));
    cout << "After calling random_shuffle:\n" << endl;
    cout << "Numbers { ";
    for(it = start; it != end; it++)
        cout << *it << " ";
    cout << " }\n" << endl;
}

Salida del programa:


Before calling random_shuffle

Numbers { 4 10 70 30 10 69 96 100  }

After calling random_shuffle

Numbers { 10 30 4 70 96 100 69 10  }

Referencias

Para obtener más información sobre la random_shuffle función, visite random_shuffle (ejemplos de STL).