基于C/C++的不重复随机数

程序员趣玩

第二章:如何简单加工rand()随机数


前言

   hello!大家好,这里是程序员小课堂。最近这几天闲来无事,想起来曾经写的一个“随机配对”的app。于是心血来潮,想把这个随机原理分享到网上,供各位广大的萌新朋友们学习。


提示:以下是本篇文章正文内容,本文以C++代码为例,原则上与C通用,如果有需要C代码的,请加博主QQ群:928357277

一、rand();函数复习

   在C\C++语言中,提供了一个rand()函数,它可以帮助我们生成随机数,首先让我们用一个简单的程序复习一下他的用法。

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
	srand((unsigned int)time(NULL));//以时间为种子准备随机数。
	int a=rand();//获得一个随机数
	return 1;
}
//time()函数的返回值必须是无符号类型,传入参数为NULL

二、编写代码

1.框架展示

假设我们将随机数看成一个数组的存储数据段中的某一段数据
1:初始化数组
2:用随机数计算数组位置
3:打印数组随机数

假设我们以一个重复的随机数来从一条不重复的数组中挖取一个数据,然后将这个数据作为我们的新的=随机数,这样,我们就得到了一个不重复的随机数,这就是本实验的原理。
依靠数组的空间特性,我们将发掘出他的更多写法。

2、.h文件

#pragma warning(disable:4996)
#ifndef _RANK_H
#define _RANk_H
#include <iostream>
#include <time.h>
#include <stdlib.h>
#define Len 1024
using namespace std; 
namespace UI{
    class Rnum;
};
//完成从(1~n)之间随机生成一个随机数,只执行n次
class Rnum
{
public:
    explicit Rnum();
    ~Rnum();
    int ran_Init(int a);//初始化、参数:随机数的取值范围
    int ran_obtain();//获得需要的随机数
    void ran_show();//查看当前随机数;

    int ran_obtain_1(int a);//获得保留随机数
    void ran_show_1();//查看保留随机数

    void ran_destroy(int a);//清除空间
    void ran_destroy_1(int a);//清除空间
private:
    int rankData[Len];//原始随机数
    int rankData_1[Len];//保留随机数
    int ranlen;//原始随机数是长度
    int rannum;//本次获得的随机数
    int ranserve;//保留随机数的长度
};
#endif

宋体自行空格加段落:

   ran_obtain_1(),ran_destory_1(),以及ran_show_1()三个函数为附加功能,他们的功能是把每一次生成的最终随机数都保存在一个新的数组中,而ran_obtain(),ran_show();两个函数每次之生成一个随机数

3、.Cpp文件

/*
作者:亿只萌新
程序:随机分配
语言:C++
*/
#include "rank.h"

Rnum::Rnum()
{
    this->ranserve= 0;
    cout<<"rank()"<<endl;
}
Rnum::~Rnum()
{
    cout<<"~rank()"<<endl;
}
int Rnum::ran_Init(int a)
{
    this->ranlen = a;//取0~n的区域
    for(int i=1;i<a+1;i++)
    {
        this->rankData[i-1] = i;
    }
    return 1;
}
int Rnum::ran_obtain()//return 0,正常退出,return 1;全部已经取出
{
    if(this->ranlen == 0)return 1;
    srand((unsigned int)time(NULL));
    int x = rand()%((this->ranlen)--);
    this->rannum=this->rankData[x];//获取当前需要的随机数赋值给rannum
    if(x==ranlen)this->rankData[x]=0;
    else
    {
        this->rankData[x]=this->rankData[ranlen];
        this->rankData[ranlen]=0;
    }
    return 0;
}
int Rnum::ran_obtain_1(int a)
{
    for(int i=0;i<a;i++)
    {
        if(this->ranlen==0)return 1;
        srand((unsigned int)time(NULL));
        int x = rand()%((this->ranlen)---);
        this->rankData_1[ranserve++]=this->rankData[x];//把每一次获得的随机数保留到一个数组中
        if(x==ranlen)this->rankData[x]=0;
        else
        {
            this->rankData[x]=this->rankData[ranlen];
            this->rankData[ranlen]=0;
        }
    }
    return 0;
}
void Rnum::ran_show_1()
{
    cout<<"ranserve="<<ranserve<<endl;
    for(int i=0;i<ranserve;i++)
    {

        cout<<'['<<this->rankData_1[i]<<']'<<"    ";
    }
}
void Rnum::ran_destroy(int a)
{
    for(int i=a-1;i>=0;i--)
    {
        this->rankData[i]=0;
    }
}

void Rnum::ran_destroy_1(int a)
{
    for(int i=a-1;i>=0;i--)
    {
        this->rankData_1[i]=0;
    }
}
void Rnum::ran_show()
{
    cout<<"本次随机数组为:"<<this->rannum<<endl;
}
int main(int argc, char** argv)
{
    Rnum XY;
    //XY.ran_Init(20);
    //XY.ran_obtain();
    //XY.ran_show();//打印一个随机数
    XY.ran_Init(20);//初始化
    XY.ran_obtain_1(20);//获得一个随机数
    XY.ran_show_1();//打印随机数
    return 1;
}

   下面是本段代码的演示结果

在这里插入图片描述

该处使用的url网络请求的数据。


总结

   以上就是基础随机配对的原理程序,在这个基本的原理上对程序稍加改造,就能创造神奇的效果。如果你学会了,不防试着简单写一个游戏的匹配的机制 。
  我是小新,期待你的关注……

上一章:几种简单的滤波算法【点击学习】

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亿只萌新

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值