利用系統函數產生隨機數

來源:互聯網
上載者:User

標籤:

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;
}

利用系統函數產生隨機數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.