zoukankan      html  css  js  c++  java
  • 随机数洗牌

      扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c运行库当中有一个随机函数rand,它可以生成0~32767之间的任意数。那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢?
    在这里我抛砖引玉一下,谈一谈自己目前已经看到的两个算法。欢迎朋友们谈一谈其他的方法。

    随机数洗牌

    1)任意洗牌

    步骤如下所示:
    a)首先生成一个数组,大小为54,初始化为1~54
    b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 pos1 = rand %54,pos2=rand %54,那么我们的索引牌就和这两个余数牌进行交换处理
    c)等多索引到54结束后,一副牌就洗好了

    void make_scrambling_array(int arr[], int n)
    {
        int i;
        srand((unsigned int)time(NULL));
        for ( i = 0; i < n ; i++)
        {
            int pos1 = rand() % n;
            int pos2 = rand() % n;
            int t;
            t = arr[pos1];
            arr[pos1] = arr[pos2];
            arr[pos2] = t;
        }
    }

    2)局部洗牌法
    上面的算法非常简单,但是有一个问题,我们发现每次洗牌之后原来洗好的牌都会进行二次操作,个人觉得有点说不过去,所以不妨加以改进:
    a)同样,首先我们生成一个大小为54的数组,数组排列为1~54
    b)索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 - index)
    c)等到所有的索引牌都洗好之后,一副牌就弄好了
    代码如下所示:

    void make_scrambling_array_1(int *array,int length)
    {
        int index;
        int value;
        int median;
    
        if(NULL == array || 0 == length)
            return ;
       srand(unsigned int time(NULL)); 
        /* 发牌的时候对于已经分配的数据不再修改 */
         for(index = 0; index < length; index ++){
            value = index + (rand()%(length - index));
    
            median = array[index];
            array[index] = array[value];
            array[value] = median;
        }
    }
  • 相关阅读:
    php命令注入
    mysql事物
    安装php环境
    移除服务器缓存实例
    show user profile synchronization tools
    manual start user profile import
    JSON is undefined. Infopath Form People Picker in SharePoint 2013
    asp.net web 应用站点支持域账户登录
    Load sharepoint envirement by powershell
    sharepoint 2016 download
  • 原文地址:https://www.cnblogs.com/chengliangsheng/p/3600834.html
Copyright © 2011-2022 走看看