C++洗牌算法「建议收藏」

1、使用标准库中的random_shuffle()函数实现很简单,代码如下:int main() {     vectorint> s_stl;     for (int i=0; i    random_shuffle(s_stl.begin(),s_stl.end());     cout “使用C++算法库:”;     for (vectorint>::iterator it=s_st

大家好,又见面了,我是你们的朋友全栈君。

1、使用标准库<algorithm>中的random_shuffle()函数实现很简单,代码如下:

 
 
 
  1. int main() 
  2.     vector<int> s_stl; 
  3.     for (int i=0; i<CARDS_COUNT; ++i) s_stl.push_back(i); 
  4.     random_shuffle(s_stl.begin(),s_stl.end()); 
  5.     cout << "使用C++算法库:"
  6.     for (vector<int>::iterator it=s_stl.begin(); it!=s_stl.end(); ++it) 
  7.         cout << " " << *it; 
  8.     return 0; 

2、不使用库函数洗牌法

(1)全局洗牌法

    步骤如下所示:

    a)首先生成一个数组,大小为54,初始化为1~54

    b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 value = rand %54,那么我们的索引牌就和这个余数牌进行交换处理

    c)等多索引到54结束后,一副牌就洗好了

    代码如下所示:

计算机中的随机数实际上都不是真正的随机数,如果两次给的种子一样,是会生成同样的随机序列的。 
所以,一般都会以当前的时间作为种子来生成随机数,这样更加的随机。
srand()给rand()提供种子 srand()中的seed一般由时间函数得,eg srand((UINT)GetCurrentTime())
srand( (unsigned)time( NULL ) ) time()函数得到现在的系统时间...等等

[cpp] 
view plain
copy

  1. void get_rand_number(int array[], int length)  
  2. {  
  3.     int index;  
  4.     int value;  
  5.     int median;  
  6.   
  7.     if(NULL == array || 0 == length)  
  8.         return ;  
  9.      srand((int)time(0)); //拿当前系统时间作为种子,由于时间是变化的,种子变化,可以产生不相同的随机数。
  10.     /* 每次发牌的时候任意分配待交换的数据 */  
  11.     for(index = 0; index < length; index ++){  
  12.         value = rand() % length;  
  13.   
  14.         median = array[index];  
  15.         array[index] = array[value];  
  16.         array[value] = median;  
  17.     }  
  18. }  

    
(2)局部洗牌法

    a)首先我们生成一个大小为54的数组,数组排列为1~54

    b)索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 – index)

    c)等到所有的索引牌都洗好之后,一副牌就弄好了

    代码如下所示:

[cpp] 
view plain
copy

  1. void get_rand_number(int array[], int length)  
  2. {  
  3.     int index;  
  4.     int value;  
  5.     int median;  
  6.       
  7.     if(NULL == array || 0 == length)  
  8.         return ;  
  9.     srand((int)time(0)); //拿当前系统时间作为种子,由于时间是变化的,种子变化,可以产生不相同的随机数。
  10.     /* 发牌的时候对于已经分配的数据不再修改 */  
  11.     for(index = 0; index < length; index ++){  
  12.         value = index + rand() % (length – index);  
  13.           
  14.         median = array[index];  
  15.         array[index] = array[value];  
  16.         array[value] = median;  
  17.     }  
  18. }  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126170.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SAE J1939 – 简短介绍[通俗易懂]

    SAE J1939 – 简短介绍[通俗易懂]SAEJ1939–简短介绍在商用车辆领域,标准化的,串行的协议用于单个电子控制单元(ECU)和传动系统组件之间的通讯已有一段时间。通过使用标准化的串行协议,可具有以下优势:组件制造商只需要采用一个协议;这主要是商用车辆才会涉及的问题,因为生产量低。商用车辆制造商可依靠不同供应商的组件。可确保组件之间的互操作性,来自不同制造商的组件不用调整就可一同工作。由国际汽车工程师协会…

    2022年5月1日
    57
  • visualSFM「建议收藏」

    visualSFM「建议收藏」visualSFM:http://ccwu.me/vsfm/ (Avisualstructurefrommotionsysytem)     visualSFM是一个使用SFM方法(structurefrommotion)用于3D重建的GUI应用,这个重建系统融合了ChangchangWu的先前的几个工程:SIFTonGPU(SiftGPU), Multic

    2022年6月20日
    52
  • Python终将成为最火爆的编程语言,因为它是属于大众的「建议收藏」

    Python终将成为最火爆的编程语言,因为它是属于大众的「建议收藏」很多培训机构宣称py是人工智能必备的编程语言,打着速成的旗号来引诱学者学习python。事实却并不是这样的,万丈高台平地起,不论你想从事怎样的编程工作,都是从最基本的编程技巧开始的;Python并不适合所有人,如果你是一个编程类专业的学生,适度了解python是有必要的(python的第三方库的爆发造就了不少C/C++程序员的就业),但如果你作为一个非编程类专业但又需要了解编程的人…

    2022年10月4日
    5
  • 关于MIUI12.5或者任何无法使用GMS谷歌全家桶的解决办法[通俗易懂]

    关于MIUI12.5或者任何无法使用GMS谷歌全家桶的解决办法[通俗易懂]首先感谢酷安社区的@兔子吃肉不吃草原文链接:https://www.coolapk.com/feed/24583874由于其文章全部都是图片贴的代码而且没加说明对于小白比较难懂,我在这里对其进行进一步的补充和完善必要条件:手机已经root,电脑安装有adb(不知道adb是什么没关系,下载个小米助手,里边会自带一个adb.exe)开始1.电脑连接手机手机打开usb调试,电脑连接手机2.进入adb命令行如果你之前已经安装了adb并且配置了环境变量,可以直接打开cmd

    2022年6月27日
    144
  • Java之路:this关键字的用法

    Java之路:this关键字的用法(1)普通方法中,this总是指向调用该方法的对象。(2)构造方法中,this总是指向正要初始化的对象。(3)this可以让类中的一个方法,访问该类的另一个方法或属性。(4)可以使用this关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。(5)this不能用于static方法。用this调用构造方法packagethis_const…

    2022年6月15日
    42
  • 卷积核与特征提取_卷积层特征各层如何保存

    卷积核与特征提取_卷积层特征各层如何保存线性滤波与卷积的基本概念线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的

    2022年8月6日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号