C/C++随机数

rand

rand是C标准库中的函数,使用线性同余法来产生随机数,是伪随机数,在随机种子相同的情况下,生成的随机数序列是一样的,所以在程序入口处往往需要设置随机数种子。

int main()
{
    srand(time(nullptr));//设置随机数种子
    for (int i = 0; i < 5; i++) {
        cout << rand() << endl;//生成随机数
    }
    system("pause");
}

default_random_engine

C++提供了default_random_engine 来生成随机数,它同样也是伪随机数,我们可以在default_random_engine构造时设置随机数种子,也可以构造完后使用其它随机数种子重置引擎状态。

int main()
{
    default_random_engine e(static_cast(time(nullptr)));//随机数引擎
    for (int i = 0; i < 5; i++) {
        cout << e() << endl;//生成随机数
    }
    cout << "" << endl; 
    e.seed(100);
    for (int i = 0; i < 5; i++) {
        cout << e() << endl;//生成随机数
    }
    system("pause");
}

如果一个函数定义了一个局部的default_random_engine,且每次调用时随机数种子都一样,则这个函数每次都会生成相同的随机数序列,将其定义为static可以保持其状态,使每次调用时生成的随机数序列不一样。

我们还可以使用min和max获取default_random_engine的随机数范围,使用discard将引擎推进指定步数。

int main()
{
    default_random_engine e;
    cout << e() << endl;
    cout << e.min() << endl;
    cout << e.max() << endl;
    e.discard(100);
    cout << e() << endl;
    system("pause");
}

获取指定范围内的数

使用uniform_int_distribution和default_random_engine可以获取在一定范围内均匀分布的随机值。

int main()
{
    uniform_int_distribution distribution(0,100);
    default_random_engine engine(static_cast(time(nullptr)));
    for (int i = 0; i < 10; i++) {
        //输出0到100内均匀分布的值
        cout << distribution(engine) << endl;
    }
    system("pause");
}

除了整数,还可以使用uniform_real_distribution获取一定范围内均匀分布的浮点数。

int main()
{
    uniform_real_distribution distribution(0,1);
    default_random_engine engine(static_cast(time(nullptr)));
    for (int i = 0; i < 10; i++) {
        //输出0到1内均匀分布的浮点数
        cout << distribution(engine) << endl;
    }
    system("pause");
}

除了均匀分布的值,还可以使用normal_distribution获取正态分布的数值序列。

int main()
{
    normal_distribution<> distribution(4,1);
    default_random_engine engine(static_cast(time(nullptr)));
    for (int i = 0; i < 10; i++) {
        //输出以4为均值,标准差为1的数
        cout << distribution(engine) << endl;
    }
    system("pause");
}

有时候我们需要在一定概率下才做某件事情,这个时候可以利用bernoulli_distribution。

int main()
{
    bernoulli_distribution distribution(0.1);
    default_random_engine engine(static_cast(time(nullptr)));
    for (int i = 0; i < 10; i++) {
        //10%的概率返回true
        cout << distribution(engine) << endl;
    }
    system("pause");
}

random_device

C++还提供了random_device生成随机数,它是真随机数,每次生成的随机数序列不一样,前面介绍的分布对象也能和它一起协同工作。

int main()
{
    random_device rd;
    for (int i = 0; i < 10; i++) {
        cout << rd() << endl;
    }

    uniform_int_distribution distribution(0, 100);
    for (int i = 0; i < 10; i++) {
        cout << distribution(rd) << endl;
    }
    system("pause");
}

你可能感兴趣的:(C/C++随机数)