aleatorio vs random_shuffle en C++

random_shuffle

Reorganiza aleatoriamente los elementos en el rango [primero, último].
La función intercambia el valor de cada elemento con algún otro elemento elegido al azar. Cuando se proporciona, la función gen determina qué elemento se elige en cada caso. De lo contrario, la función utiliza alguna fuente de aleatoriedad no especificada.

// CPP program Illustrating the
// use of random_shuffle
#include <bits/stdc++.h>
using namespace std;
  
// random generator function
int randomfunc(int j)
{
    return rand() % j;
}
  
int main()
{
    srand(unsigned(time(0)));
    vector<int> arr;
  
    // set some values:
    for (int j = 1; j < 10; ++j)
  
        // 1 2 3 4 5 6 7 8 9
        arr.push_back(j);
  
    // using built-in random generator
    random_shuffle(arr.begin(), arr.end());
  
    // using randomfunc
    random_shuffle(arr.begin(), arr.end(), randomfunc);
  
    // print out content:
    cout << "arr contains:";
    for (auto i = arr.begin(); i != arr.end(); ++i)
        cout << ' ' << *i;
  
    cout << endl;
  
    return 0;
}

Producción:

arr contains: 5 8 1 7 9 6 4 3 2

barajar

Reorganiza los elementos en el rango [primero, último] al azar, usando g como generador uniforme de números aleatorios.
La función intercambia el valor de cada elemento con el de algún otro elemento elegido al azar. La función determina el elemento elegido llamando a g().

// CPP program Illustrating
// the use of shuffle
#include <bits/stdc++.h>
using namespace std;
  
// Driver Program
int main()
{
    array<int, 5> s{ 1, 2, 3, 4, 5 };
  
    // To obtain a time-based seed
    unsigned seed = 0;
  
    // Use of shuffle
    shuffle(s.begin(), s.end(), default_random_engine(seed));
  
    cout << "shuffled elements are:";
    for (int& i : s)
        cout << ' ' << i;
    cout << endl;
  
    return 0;
}

Producción:

 
shuffled elements are: 3 1 5 4 2

¿Cuál es la diferencia entre shuffle y random_shuffle c++?

  1. La única diferencia es que random_shuffle usa la función rand() para aleatorizar los elementos, mientras que shuffle usa urng, que es un mejor generador aleatorio, aunque con la sobrecarga particular de random_shuffle, podemos obtener el mismo comportamiento (como con shuffle).
  2. shuffle es una mejora sobre random_shuffle, y deberíamos preferir usar el primero para obtener mejores resultados.
  3. Ejemplo de Intercambio de Variables usando ambas
    mezclas aleatorias:
    template (class RandomIt, class RandomFunc)
    void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r)
    {
        typename iterator_traits::difference_type i, n;
        n = last - first;
        for (i = n-1; i > 0; --i) {
            using std::swap;
            swap(first[i], first[r(i+1)]);
        }
    }
    

    Barajar:

    template void shuffle(RandomIt first, RandomIt last, 
                 UniformRandomBitGenerator&& g)
    {
        typedef typename iterator_traits::difference_type diff_t;
        typedef uniform_int_distribution distr_t;
        typedef typename distr_t::param_type param_t;
     
        distr_t D;
        diff_t n = last - first;
        for (diff_t i = n-1; i > 0; --i) {
            using swap;
            swap(first[i], first[D(g, param_t(0, i))]);
        }
    }

Este artículo es una contribución de Shambhavi Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *