📜  在C++中随机播放vs random_shuffle

📅  最后修改于: 2021-05-30 04:02:03             🧑  作者: Mango

random_shuffle

它随机地重新排列范围内的元素[first,last)。
该函数将每个元素的值与一些其他随机选择的元素交换。提供时,函数gen确定在每种情况下都选择哪个元素。否则,该函数将使用一些未指定的随机性来源。

// CPP program Illustrating the
// use of random_shuffle
#include 
using namespace std;
  
// random generator function
int randomfunc(int j)
{
    return rand() % j;
}
  
int main()
{
    srand(unsigned(time(0)));
    vector 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;
}

输出:

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

洗牌

使用g作为统一随机数生成器,随机重新排列[first,last)范围内的元素。
该函数将每个元素的值与其他随机选取的元素的值交换。该函数通过调用g()确定选择的元素。

// CPP program Illustrating
// the use of shuffle
#include 
using namespace std;
  
// Driver Program
int main()
{
    array 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;
}

输出:

shuffled elements are: 3 1 5 4 2

shuffle和random_shuffle C++有什么区别?

  1. 唯一的区别是random_shuffle使用rand()函数对项进行随机化,而shuffle使用的urng是更好的随机生成器,尽管在random_shuffle特定的重载下,我们可以获得相同的行为(与shuffle一样)。
  2. 随机播放是对random_shuffle的改进,我们应该更喜欢使用前者以获得更好的结果。
  3. 同时使用两者交换变量的示例
    随机洗牌:
    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)]);
        }
    }
    

    随机播放:

    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))]);
        }
    }
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”