• C++产生随机数理解


    rand:

    rand()函数需要用到头文件#include<cstdlib>,根据种子值返回一个伪随机函数,为什么说是伪随机,是因为程序都是根据一定的算法来实现的,在不设置srand时,默认为调用的是srand(1),由于每次都是一样的种子值,使得每次运行产生的结果都是相同的。

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    int main()
    {
        int Rand[10];
        for(int i=0;i<10;i++)
            Rand[i]=rand();
        for (int i = 0; i<10; i++)
            cout<<Rand[i]<<" ";
        system("pause");
    }

    每次运行结果都是相同:

    srand:

    通过修改种子值srand可以使得每次产生的随机数不同,但是还是会有一定的规律,为了产生更加随机的随机数,一般是采用时间作为种子数

    srand((unsigned)time(NULL));//需要头文件#include<ctime>

    修改后的代码如下:

    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    int main()
    {
        int Rand[10];
        srand((unsigned)time(NULL));
        for(int i=0;i<10;i++)
            Rand[i]=rand();
        for (int i = 0; i<10; i++)
            cout<<Rand[i]<<" ";
        system("pause");
    }

    可以发现每次运行的结果都不一样了。

    通式:

    如果要去一定范围内的值,则要用到通式k=x+rand()%(y-x+1),k即为所求范围内随机生成的数,rand()%a的结果最大为a-1。

    整数例子:

    [0,10]:rand()%11

    [1,11]:1+rand()%11

    (0,10):1+rand()%9

    浮点数例子:

    [0.0,1.0]=(rand()%10)*0.1

    函数:

    上述例子产生随机数都是在main函数中,但是有时候我们希望把产生随机数的函数封装起来,适当地调用,但是错误的编写就会导致每次出来的随机数都是相同的。

    错误例子

    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    int GetRand() {
        int Rand;
        srand((unsigned)time(NULL));
        Rand = rand()%10;
        return Rand;
    }
    int main()
    {
        int Rand[10];
        for(int i=0;i<10;i++)
            Rand[i]=GetRand();
        for (int i = 0; i<10; i++)
            cout<<Rand[i]<<" ";
        system("pause");
    }

    正确例子:

    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    int GetRand() {
        int Rand;
        Rand = rand()%10;
        return Rand;
    }
    int main()
    {
        int Rand[10];
        srand((unsigned)time(NULL));
        for(int i=0;i<10;i++)
            Rand[i]=GetRand();
        for (int i = 0; i<10; i++)
            cout<<Rand[i]<<" ";
        system("pause");
    }

    产生这个的原因很简单,错误的例子中每一次进入for循环都是重新设置了一次种子值,由于程序运行速度十分快,srand是以秒作为时间单位,这就是相当于每一次进入循环的重新设置了相同的种子值,所以得出的结果也就是相同了。

    而在正确的例子中,把设置种子值调用在for之前,也就相当于把后面的十次循环按照第一次设置的种子值产生序列,自然值也就不同。

    处理方法并不唯一,另一种处理方式是利用类结构体:

    class RandomNumber {
    public:
        RandomNumber() {
            srand((unsigned)time(NULL));
        }
        int GetRand() {
            int RandNumber;
            RandNumber = rand()%301;
            return RandNumber;
        }
    };

    通过构造函数在创建类时设置好种子值,后序调用自然也会按照该种子值设定好的序列来进行。

    总结:

    一般情况下,在程序中只要写一次srand((unsigned)time(NULL))即可,需要注意该语句是否处在循环中。

    PS:以前不懂都是把srand的语句瞎换位置,不用就把语句直接写mian函数中,果然适当的理解比瞎实践有用很多。

  • 相关阅读:
    保险行业电话外呼型呼叫中心方案
    12355青少年服务台呼叫中心解决方案
    未能找到类型集或命名空间名称 "xxxxxx" (是否缺少using 指令或引用?)
    Smarty中section的使用
    什么是Asterisk,它如何帮助我们的呼叫中心?
    高效呼叫中心的8个健康工作习惯
    Python 爬起数据时 'gbk' codec can't encode character 'xa0' 的问题
    Python 网页解析器
    Python 爬虫入门3种方法
    Python open 读写小栗子
  • 原文地址:https://www.cnblogs.com/VingB2by/p/10127610.html
Copyright © 2020-2023  润新知