随机函数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;
}
 
在这个函数中,可以随机排列两个数组中的值,且产生的排列顺序是不一样的。
 
 
相关文章
Random随机数的使用
Random随机数的使用
123 0
|
3月前
|
Java
成随机数的几种方法、Math.random()随机数的生成、Random()的使用
这篇文章介绍了生成随机数的三种方法:使用`System.currentTimeMillis()`获取当前时间的毫秒值来生成0到100的随机整数、使用`Math.random()`生成[0,1)范围内的`double`类型随机数并扩大到指定范围、以及使用`Random`对象的`nextInt()`方法生成指定范围内的随机整数,并提供了相应的Java代码示例和测试结果。
成随机数的几种方法、Math.random()随机数的生成、Random()的使用
|
6月前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
188 0
|
5月前
|
算法 编译器 C++
随机数的实现——rand函数、srand函数和time函数
随机数的实现——rand函数、srand函数和time函数
|
4月前
|
安全 算法 Java
使用Random.next生成随机数
使用Random.next生成随机数
|
6月前
|
算法 安全 数据安全/隐私保护
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(一)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
425 0
|
存储 算法 C语言
你不了解的随机函数rand
你不了解的随机函数rand
116 0
|
存储 C++
【C/C++】如何生成随机数?带你深入了解rand函数
【C/C++】如何生成随机数?带你深入了解rand函数
229 0
|
编译器 C语言 C++
C++中rand随机数的用法
C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)