随机函数random() rand() srand() randomize()

简介:     这几天在帮朋友开发一个软件,里面要产生一些随机数。这里把我学到的东西总结一下,有些具体的原理是什么,我也不太清楚,只知道怎么用。写下来,和大家分享,希望对大家有点用,若有不对的地方,希望大家给指出来。
    这几天在帮朋友开发一个软件,里面要产生一些随机数。这里把我学到的东西总结一下,有些具体的原理是什么,我也不太清楚,只知道怎么用。写下来,和大家分享,希望对大家有点用,若有不对的地方,希望大家给指出来。
    要产生一个随机数,必须得指定一个随机数种子。指定随机数种子可以通过以下两个函数来实现---------randomize()和srand().
 
randomize():它的功能是初始化随机数发生器。在c++ builder中函数声明如下:
extern PACKAGE void __fastcall Randomize(void)
其英文描述如下:
Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed.
可以看出,randomize()函数是用系统的时间作为随机数种子,初始化随机数发生器的。
 
srand():它的功能也是初始化随机数发生器。在c++ builder中函数声明如下:
void srand(unsigned seed)
其英文描述:
Initializes random number generator.
The random number generator is reinitialized by calling srand with an argument value of 1. It can be set to a new starting point by calling srand with a given seed number.
可以看出:srand()是通过参数seed来指定随机数种子的。
 
指定了随机数种子,我们就可以调用函数 rand()和 random()来产生随机数了。调用它可以返回一个随机数。rand()函数其定义如下
int rand():调用它将返回一个0--32767之间的一个int 型数值。
 
random()函数其定义如下:
int random(int num):调用它可以返回一个 0---(num-1)之间的一个int 型数值。
 
若想返回一个从[a,b)之间的数,可以通过一个通用的公式:
(rand()%(b-a))+a  返回的数值包含a,包含b。若 a=0,就可以返回一个 0--b之间的数值。
 
在实际的应用中,要注意的是: 若初始化随机数种子一样,则它产生的随机数是一样的。反之,若每次想产生不同的随机数,则必须使每次的随机数种子不一样才行。
我在实际的应用中,要产生一个随机数队列,且队列里的每一个值则不一样,其实现方式如下:
 
void TSelect::GenThesaQue(int NumofThesa,int Top)
{
  int ThesaCounter=0,LoopNum,TmpRand;
    Randomize();
    while(true)
    {
        TmpRand=random(Top-1) + 1;
        for (LoopNum=0;LoopNum            if (Thesa_select[LoopNum]==TmpRand)
                //产生的随机数已在队列中则重新循环产生下一个随机数
                break;
        if (LoopNum>=ThesaCounter)
            //无重复,将产生的随机数加入到队列中
            Thesa_select[ThesaCounter++]=TmpRand;
        if (ThesaCounter>=NumofThesa)
            break;
    }
}
函数参数说明:
参数 Top: 随机数数据的上限,如要产生1----16的数据,则Top = 16;
参数 NumofThesa: 产生随机数据的个数。
在程序中 Thesa_Select是一个数组,存储产生的随机数。
 
void TSelect:: GenLabelQue(void)
{
   int  Que1[4] ={2,4,6,8};
   int  Que2[4] ={3,5,7,9};
   int  totel = 4;
   int c,i,d=0;
   int c_up;
   Randomize();
   for(;totel>1;totel--)
   {
     if(totel == 4)
     {
       c = RandMe(totel);
       c_up = c;
     }
     else if(totel == 3)
     {
       Randomize();
       srand(c_up);
       c = rand()%totel;
       c_up = c;
     }
     else if(totel == 2)
     {
        Randomize();
        srand(c_up);
        c = rand()%totel;
     }
     Prim[d++] = Que1[c];
     c++;
     for(;c        Que1[c-1] = Que1[c];
   }
   Prim[3] = 20 - Prim[0]-Prim[1]-Prim[2];
   Randomize();
   totel = 4;
   d = 0;
   for(;totel>1;totel--)
   {
     c = Select->RandMe(totel);
     Thesa[d++] = Que2[c];
     c++;
     for(;c       Que2[c-1] = Que2[c];
   }
   Thesa[3] = 24 - Thesa[0]-Thesa[1]-Thesa[2];
}
 
 
int TSelect::RandMe(int   IntLS)
{
  //IntLS为随机范围
  int  RandMeInt;
  srand((unsigned)time(NULL));
  RandMeInt = rand()%IntLS;
  return   RandMeInt;
}
 
在这个函数中,可以随机排列两个数组中的值,且产生的排列顺序是不一样的。
 
 
目录
相关文章
Vue3炫酷可旋转的3D地球
Vue3炫酷可旋转的3D地球
617 0
|
数据采集 JSON NoSQL
JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了
JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了
1372 0
JSON转Markdown:我把阅读数据从MongoDB中导出转换为.md了
|
Java 程序员 编译器
【C/C++析构函数 】C++中的“垃圾回收”机制_析构
【C/C++析构函数 】C++中的“垃圾回收”机制_析构
236 0
|
Web App开发 小程序 网络安全
Mac Charles 抓包 iPhone Https(详细流程)
Mac Charles 抓包 iPhone Https(详细流程)
1475 2
|
弹性计算 供应链 数据库
阿里云服务器付费类型包年包月、按量付费、抢占式实例区别及适用场景参考
阿里云服务器有包年包月、按量付费、抢占式实例三种付费类型可选,不同类型的模式收费标准与适用场景是不一样的,有的用户由于初次购买阿里云服务器,并不清楚他们之间的区别,以及什么样的情况下应该选择哪种付费类型,本文为大家介绍下阿里云服务器付费类型包年包月、按量付费、抢占式实例区别及适用场景参考。
1434 0
阿里云服务器付费类型包年包月、按量付费、抢占式实例区别及适用场景参考
|
JSON 数据格式 Python
Python三行代码实现json转Excel
最近重保,经常需要通过Excel上报威胁事件。安全设备的告警很多都是json格式的,就需要将json转成Excel。 用Python将json转成excel也就三行代码的事,先将json串导入形成字典对象,再通过pandas转成DataFrame直接输出excel。
1287 0
Python三行代码实现json转Excel
|
Ruby
RVM切换ruby版本
RVM是Ruby Version Manager的缩写,是一个命令行工具,它可以让你轻松地安装,管理和使用多个版本的Ruby.不同的rails项目使用等ruby和rails版本不一样的时候,可以使用RVM自由切换。
4625 0
|
自然语言处理 iOS开发 开发者
iOS MachineLearning 系列(11)—— 自然语言识别与文本分析
在上一篇文章中,我们介绍了使用NaturalLanguage框架来进行自然语言的拆解,可以将一段文本按照单词,句子或段落的模式进行拆解。并且,在进行拆解时,其可以自动的识别所使用的语言。
387 0
|
C++
当输入中有空行时,如何在 C++ 中使用 getline()?
在 C++ 中,如果我们需要从一个流中读取好几个句子,我们通常会首选的方法是使用 getline() 函数。因为它可以读取直到遇到换行符或看到用户提供的分隔符
728 0
|
算法 安全 数据安全/隐私保护
iOS的RSA加密工具类
iOS的RSA加密工具类
354 0
iOS的RSA加密工具类