zoukankan      html  css  js  c++  java
  • std::shuffle-c++

        在Python中我们会经常看到shuffle的随机排列函数,其可以将列表中的内容进行随机排列,但在C++中却需要自己去实现这样功能的函数(c++0x之前)。在c++0x之后这样的功能函数在标准库中已有对应的提供——std::shuffle。下面就对该函数做具体的介绍:
     
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. template <class RandomAccessIterator, class URNG>  
    2. void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);  

    函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. template <class RandomAccessIterator, class URNG>  
    2. void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g)  
    3. {  
    4.   for (auto i = (last-first) - 1; i > 0; --i) {  
    5.     std::uniform_int_distribution<decltype(i)> d (0,i);  
    6.     swap (first[i], first[d (g)]);  
    7.   }  
    8. }  
    函数必须与标准库默认的随机生成器一起使用,随机生成器的头文件是<random>。如果要使用不需要传入随机生成器函数可以参照random_shuffle函数。
    参数:
    first, last
    顺序容器迭代器的开头(begin)和结尾(end),在[first, end)这个区间内的数值将会被随机排序。顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换。
    g
    唯一随机数生成器的一个实例,在头文件<random>中定义。URNG 是 uniform random number generator的缩写。
    返回值:
    None
     
    用例:
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include <iostream>  
    2. #include <vector>  
    3. #include <algorithm> // std::move_backward  
    4. #include <random> // std::default_random_engine  
    5. #include <chrono> // std::chrono::system_clock  
    6.   
    7. int main (int argc, char* argv[])  
    8. {  
    9.     std::vector<int> v;  
    10.   
    11.     for (int i = 0; i < 10; ++i) {  
    12.         v.push_back (i);  
    13.     }  
    14.   
    15.     // obtain a time-based seed:  
    16.     unsigned seed = std::chrono::system_clock::now ().time_since_epoch ().count ();  
    17.     std::shuffle (v.begin (), v.end (), std::default_random_engine (seed));  
    18.   
    19.     for (auto& it : v) {  
    20.         std::cout << it << " ";  
    21.     }  
    22.   
    23.     std::cout << " ";  
    24.   
    25.     return 0;  
    26. }  

    编译:
    g++ main.cpp -o shuffle -std=c++0x
     
    执行输出:
    6 4 2 3 7 8 5 1 9 0
    4 7 3 6 8 0 2 9 5 1
  • 相关阅读:
    java项目启动报Unsupported major.minor version 51.0错
    eclipse启动报错
    使用ftp加IP上传文件
    Java替换中使用正则表达式实现中间模糊匹配
    使用Tomcat安装版启动项目
    java文件流操作
    mybatis所需pom文件内容以及配置文件
    个人写spark小测试
    spark介绍2
    RDD介绍与执行
  • 原文地址:https://www.cnblogs.com/lx-hhxxttxs/p/5908213.html
Copyright © 2011-2022 走看看