Chinaunix首页 | 论坛 | 博客
  • 博客访问: 621635
  • 博文数量: 363
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 1347
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-22 16:07
文章分类

全部博文(363)

文章存档

2018年(83)

2016年(1)

2014年(2)

2013年(34)

2012年(236)

2011年(7)

分类:

2012-05-27 10:51:30

    这几天在帮朋友开发一个软件,里面要产生一些随机数。这里把我学到的东西总结一下,有些具体的原理是什么,我也不太清楚,只知道怎么用。写下来,和大家分享,希望对大家有点用,若有不对的地方,希望大家给指出来。
    要产生一个随机数,必须得指定一个随机数种子。指定随机数种子可以通过以下两个函数来实现---------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;
}
 
在这个函数中,可以随机排列两个数组中的值,且产生的排列顺序是不一样的。
 
 
阅读(1564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~