写点什么

利用 C++ 标准库算法 std::shuffle 洗牌

作者:老王同学
  • 2023-08-29
    广东
  • 本文字数:722 字

    阅读完需:约 2 分钟

我早年曾在random_shuffle算法小例子一文中,介绍了使用 C++标准库算法 std::random_shuffle 洗牌的方法。

但 std::random_shuffle 已在 C++17 标准中被移除了。因为它依赖 C 的 rand 函数,使用的是全局变量保存状态, 而众所周知,如果不使用 srand 初始化种子,每次程序启动后,rand 得到的都是相同的序列.

C++17 使用新的 std::shuffle, 其原型为:

template<class RandomIt, class RandomFunc>void shuffle(RandomIt first, RandomIt last, RandomFunc&& rand);
复制代码
  • 第 3 个参数 rand:表示一个可调用对象,用于生成随机数。它接受一个整数参数,并返回一个介于 0 和该参数之间的随机数。

一般用 random_device 与 mt19937 来生成随机数.

  • std::random_device 使用硬件设备(如计时器、熵池等)来生成随机数。

  • std::mt19937 基于梅森旋转算法(Mersenne Twister)的伪随机数生成器,它的周期非常长,达到 2^19937 - 1, 故名。


利用 std::shuffle 的洗牌方法非常简单,无需过多解释。


 #include <iostream>#include <array>#include <algorithm>#include <random> using namespace std;  void test_shuffle(){    const int POKER_NUM = 52;    array<int, POKER_NUM> pokers;     for (int i = 0; i < POKER_NUM; ++i) //初始化一副扑克牌:0-51    {        pokers[i] = i;    }     /* 仅需调用 shuffle 即可. */    random_device rand_dev;    mt19937 rand_gen(rand_dev());     shuffle(pokers.begin(), pokers.end(), rand_gen);      for (int i = 0; i < POKER_NUM; ++i) //打印结果    {        cout << pokers[i] << " ";    }    cout << endl;} int main(){    test_shuffle();    cin.get();}
复制代码


发布于: 刚刚阅读数: 6
用户头像

老王同学

关注

多读书,勤跑步,少做梦 2020-04-30 加入

还未添加个人简介

评论

发布
暂无评论
利用C++标准库算法 std::shuffle 洗牌_c++_老王同学_InfoQ写作社区