这几天在帮朋友开发一个软件,里面要产生一些随机数。这里把我学到的东西总结一下,有些具体的原理是什么,我也不太清楚,只知道怎么用。写下来,和大家分享,希望对大家有点用,若有不对的地方,希望大家给指出来。
要产生一个随机数,必须得指定一个随机数种子。指定随机数种子可以通过以下两个函数来实现---------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 型数值。
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;
{
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;
}
}
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;
{
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];
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];
}
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;
}
{
//IntLS为随机范围
int RandMeInt;
srand((unsigned)time(NULL));
RandMeInt = rand()%IntLS;
return RandMeInt;
}
在这个函数中,可以随机排列两个数组中的值,且产生的排列顺序是不一样的。