伪随机数及避免重复的方法

伪随机数实现

#include <limits.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
class TRandom
{
public:
    TRandom(long seed=0){mSeed=(seed?seed:GetTickCount());}
    void Seed(long seed=0)  { mSeed=(seed?seed: GetTickCount( )); }
    int  Integer()                { return Next();}
    int  Integer(int min,int max) { return min+Next()%(max-min+1);}
    double Real()               {return double(Next())/double(INT_MAX);}
private:
    void Change()       {mSeed=(314159265*mSeed+13579)%ULONG_MAX;}
    int  Next() {
                int loops=mSeed%3;
                for (int i=0;i<=loops;i++)
                    Change ();
        return int(mSeed/2);
            }
    unsigned long  mSeed;
};

避免重复的使用方法

法一
洗牌例子:

#include"TRandom.h"
#include<iostream>
using namespace std;
int main()
{
    int poker[54],i,j;
    TRandom t;
    for (i=0;i<54;i++)
    {
        poker[i]=t.Integer(0,53);
        int flag=1;                     //增加了flag结合while避免出现重复数
        while(flag==1)
        {
            for(j=0;j<i;j++)
                if(poker[i]==poker[j])
                    break;
            if(j<i)
                poker[i]=t.Integer(0,53);
            if(j==i)
                flag=0;
        }

    }
    for(i=0;i<54;i++)
    {
        cout<<poker[i]<<" ";
    }
    return 0;
}

法二

#include "TRandom.h"
#include<iostream>
int main()
{
        int cards[54];
    for(int i=0;i<54;++i)
        cards[i]=i+1;
        TRandom rand;   //创建伪随机数发生器的一个实例对象
  //以下是洗牌过程
         for(int j=0;j<54;++j) {
          int pos=rand.Integer(j,53); //pos是一个[j,53]之间的随机数
                  //交换cards[j]和cards[pos];
                  int temp=cards[j];
                  cards[j]=cards[pos];
                   cards[pos]=temp;
       }
//输出洗牌结果
         for (int k=0;k<54;++k)
                    cout<<"Cards["<<k<<"]="<<cards[k]<<endl;
         return 0;  
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math...
    GB_speak阅读 41,388评论 2 6
  • 作者:Alon Zakai 编译:胡子大哈 翻译原文:http://huziketang.com/blog/pos...
    胡子大哈阅读 3,245评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,399评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,305评论 18 399
  • 泼天的烈火燃起, 亡命天涯,又始终执手。 好像梦见了前世, 你把危险始终挡在身前, 直到我看见你被鞭打, 血痕,痛...
    春余清歌阅读 1,686评论 0 1

友情链接更多精彩内容