zoukankan      html  css  js  c++  java
  • 利用系统函数产生随机数

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

  • 相关阅读:
    POJ2253——Frogger(Floyd变形)
    Mininet python代码创建拓扑、交互式界面创建主机、交换机
    Wireshark小技巧
    胖AP基本配置:
    IPsec
    数据链路层、ARP/RARP、ICMP、ping和traceroute
    IPv4地址范围和一些小知识
    UDP:rfc768/广播和多播/IGMP
    TCP
    人生苦短之我用Python篇(XML模块)
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4621722.html
Copyright © 2011-2022 走看看