標籤:
rand()函數產生一個0 to RAND_MAX (32767)的隨機數,用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。
0~RAND_MAX每個數字被選中的機率是一樣的。rand函數內部是使用線性同餘法實現的,它不是真的隨機數,因為周期特
別長,所以可以看成是隨機的。使用者未設定隨機種子時,系統預設隨機種子為1. rand產生的是偽隨機數,每次執行時是相
同的,若要不同需要使用隨機種子函數srand初始化,如果程式連續快速產生隨機數,使用了srand還是可能會出現大量的相
同隨機數,即使直接使用時間((unsigned)time(NULL))作為隨機種子還是無法解決,可以先設定用時間作為隨機種子併產
生隨機數再用這個隨機數作為下次產生隨機數的隨機種子。下面有使用的完整代碼。
static int seed = (unsigned)time(NULL);
int RandomOneNum(int min,int max,bool bNegative)//產生一個隨機數
{
if (min <= 0 || max < 0 || min >= max)
{
return 0;
}
srand(seed);
seed = rand();
int num = rand()%(max+1-min) + min;
if (!bNegative)
{
return num;
}
return -num;
}
int* RandomNums(int min,int max,int n,bool bNegative)//產生指定範圍內的隨機數,可以有重複的,可以選擇產生負數,正負數只做一種範圍
{
if (min <= 0 || max < 0 || min >= max || n < 0)
{
return NULL;
}
int *pNums = new int[n];
if (NULL == pNums)
{
return NULL;
}
for (int i = 0; i < n;i++)
{
pNums[i] = RandomOneNum(min,max,bNegative);
}
return pNums;
}
int* RandomNoDumpNums(int min,int max,int n,bool bNegative) //產生指定範圍內的隨機數,不能有重複的,可以選擇產生負數,使用set唯一特性實現
{
if (min <= 0 || max < 0 || min >= max || n < 0)
{
return NULL;
}
int *pNums = new int[n];
if (NULL == pNums)
{
return NULL;
}
std::set<int> set_nums;
int nIndex = 0;
while (true)
{
if (set_nums.size() == n)
{
break;
}
std::pair<std::set<int>::iterator,bool> insert_pair;
insert_pair = set_nums.insert(RandomOneNum(min,max,bNegative));
if (insert_pair.second == true)
{
pNums[nIndex++] = *insert_pair.first;
}
}
set_nums.clear();
return pNums;
}
int* RandomNoDumpNums2(int min,int max,int n,bool bNegative)//產生指定範圍內的隨機數,不能有重複的,通過將正常範圍的數隨機打散實現
{
if (min <= 0 || max < 0 || min >= max || n < 0)
{
return NULL;
}
int *pNums = new int[n];
if (NULL == pNums)
{
return NULL;
}
srand(seed);
seed = rand();
int *temp = new int[max+1];
if (bNegative == false)
{
for (int i = 0; i <= max; i++)
{
temp[i] = i;
}
}
else
{
for (int i = 0; i <= max; i++)
{
temp[i] = -i;
}
}
for (int i = max; i > min;i--)
{
int t = temp[i];
int s = rand()%(i-min) + min;
temp[i] = temp[s];
temp[s] = t;
}
for (int i = 0; i < n; i++)
{
pNums[i] = temp[min++];
}
delete temp;
return pNums;
}
int* RandomNoDumpNums3(int min,int max,int n,bool bNegative)//產生指定範圍內的隨機數,不能有重複的,使用標誌位實現
{
if (min <= 0 || max < 0 || min >= max || n < 0)
{
return NULL;
}
int *pNums = new int[n];
if (NULL == pNums)
{
return NULL;
}
srand(seed);
seed = rand();
int *temp = new int[max+1];
if (bNegative == false)
{
for (int i = 0; i <= max; i++)
{
temp[i] = -1;
}
}
else
{
for (int i = 0; i <= max; i++)
{
temp[i] = 1;
}
}
int m = 0;
if (bNegative == false)
{
for (int i = 0; i < n; i++)
{
m = rand()%(max+1-min) + min;
while (-1 != temp[m]);
pNums[i] = m;
}
}
else
{
for (int i = 0; i < n; i++)
{
m = rand()%(max+1-min) + min;
while (-1 != temp[m]);
pNums[i] = -m;
}
}
delete temp;
return pNums;
}
bool IsThereDumplcates(int array[],int n)
{
std::set<int> set_nums;
for (int i = 0; i < n; i++)
{
set_nums.insert(array[i]);
}
return !(n == set_nums.size());
}
測試程式:
int _tmain(int argc, _TCHAR* argv[])
{
for (int i = 0; i < 100; i++)
{
//int *p = RandomNums(1,15,15);
//int *q = RandomNoDumpNums(1,15,15);
//int *q = RandomNoDumpNums2(1,15,15);
int *q = RandomNoDumpNums2(1,15,15);
// if(NULL != p)
// {
// for (int m = 0; m < 15;m++)
// {
// cout<<p[m]<<"-";
// }
// cout<<endl;
// delete p;
// }
// cout << "----------------------------------------"<<endl;
if(NULL != q)
{
for (int n = 0; n < 15;n++)
{
cout<<q[n]<<"-";
}
cout<<endl;
if (IsThereDumplcates(q,15))
{
cout<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
}
delete q;
}
cout << "*****************************************"<<endl;
}
system("pause");
return 0;
}
利用系統函數產生隨機數