本文主要是介绍生成互不相同随机数的一种算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C++中常用rand()和srand()函数相结合来生成每次执行都不相同的一组随机数,常见的写法如下:
[cpp] view plain copy
#include <iostream>
#include <cstdlib>
#include <tchar.h>
#include <ctime>
using namespace std;
int _tmain(int argc,_TCHAR* argv[])
{
int randomSum=5,randomLimit=10;
int random=0;
srand(static_cast<unsigned int>(time(NULL)));
for(int i=0;i<randomSum;i++)
{
random=rand()%randomLimit;
cout<<random<<"\t";
}
cout<<endl;
system("PAUSE");
return 0;
}
这个程序是随机产生5个0~9(包括0和9)之间的随机数。每次执行程序,产生的是不同的。
当然如果实验的次数足够大时,每个数产生的概率肯定是差不多的。但具体大每一次中不免有重复的数字,怎么才能产生一组互不相等的随机数呢?
有很多种方法,这里介绍一种实现,具体如下:
一、动态生成一个数组,其长度是要产生随机数的上界,每个元素的值为其对应的下标。
二、随机生成该范围内的一个数,以该数为数组下标,取出对应的数组中的元素(其实数组中的元素和该随机数一样),取出后,将下标对应的数组元素赋值为-1(赋值-1是因为随机数中或许有0),来作为下次判断的依据。
三、再产生该范围内的随机数,如果对应的数组下标中的元素是-1,就再生成,直到不是-1为止。
四、重复步骤二、三,直到产生够所需的随机数个数。
注意点:随机数个数应小于等于随机数的范围
具体的代码如下:
[cpp] view plain copy
void RandomNumbers(int limit,int sum)
{
fstream file("data.txt",ios::out);
int count=0,number=0;
int *temp=new int[limit];
for(int i=0;i<limit;i++)
{
temp[i]=i;
}
srand(static_cast<unsigned int>(time(NULL)));
for(int i=1;i<=sum;i++)
{
number=rand()%limit;
while(temp[number]==-1)
{
number=rand()%limit;
}
file<<temp[number]<<"\t";
count++;
if(count%10==0)
{
file<<endl;
}
temp[number]=-1;
}
delete []temp;
temp=NULL;
file.close();
cout<<"已产生"<<sum<<"个"<<"大于等于0少于"<<limit<<"的互不相等的随机数"<<endl;
}
该函数实现的是产生0~limit(包括0和limit)内的sum个随机数,并存入data.txt文件中。
思考:该算法就是用空间来换时间,如果每次产生一个随机数都和前面产生的比较的话,将耗费大量的时间。
这篇关于生成互不相同随机数的一种算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!