• 生成随机数


     C语言中生成随机数的方法:

    #include <time.h>
    #include <stdlib.h>
    
    int main()
    {
        srand(time(NULL)); //为rand函数提供种子
        printf("%d
    ", rand() % 10); //输出一个随机数,范围为0-9
        printf("%d
    ", rand() % 10 + 1); //输出一个随机数,范围为1-10
    
        return 0;
    }

      C++11中生成随机数需要随机数引擎类default_random_engine,包含头文件<random>:

    #include <random>
    
    default_random_engine e; //随机数引擎类
    for (size_t i = 0; i < 5; ++i)
        cout << e() << ", "; //生成原始随机数,输出为3499211612, 581869302, 3890346734, 3586334585, 545404204

     指定生成的随机数区间需要随机数分布类uniform_int_distribution:

    void RandPrint()
    {
        default_random_engine e;
        uniform_int_distribution<unsigned> u(0, 100); //随机数分布类,生成的随机数在0-100之间
    
        for (size_t i = 0; i < 10; ++i)
            cout << u(e) << endl; //将u作为随机数源,生成10个随机数
    }

     上面的RandPrint()如果两次调用的话会发现生成的随机数是相同的,要每次调用RandPrint生成不同的随机数需要引擎和分布对象保持状态,因此可以将他们定义为static来实现:

    void RandPrint()
    {
        static default_random_engine e;
        static uniform_int_distribution<unsigned> u(0, 100); //随机数分布类,生成的随机数在0-100之间
    
        for (size_t i = 0; i < 10; ++i)
            cout << u(e) << endl; //将u作为随机数源,生成10个随机数
    }

     上面的函数每次运行程序都会生成相同的随机数,如果每次运行程序都要生成不同的随机数需要提供一个“种子”。“种子”就是一个数值,可以在引擎对象创建的时候提供种子,也可以调用引擎的seed()成员来设置种子:

    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    #include <ctime>
    #include <random>
    using std::default_random_engine;
    using std::uniform_int_distribution;
    using std::cout;
    using std::endl;
    
    void RandPrint(long long llSeeds)
    {
        static default_random_engine e;
        e.seed(llSeeds);
        static uniform_int_distribution<unsigned> u(0, 100); //随机数分布类,生成的随机数在0-100之间
    
        for (size_t i = 0; i < 10; ++i)
            cout << u(e) << ", "; //将u作为随机数源
    }
    
    int main()
    {
        RandPrint(100);
        RandPrint(100);
        //上面两次生成的随机数相同,因为种子相同
    
        RandPrint(time(0));
        Sleep(2000);
        RandPrint(time(0));
        //上面两次生成的随机数相同,因为种子不同
    
        return 0;
    }

     生成浮点类型的随机数,使用uniform_real_distribution:

    void RandPrint(long long llSeeds)
    {
        static default_random_engine e;
        e.seed(llSeeds);
        static uniform_real_distribution<double> u(0, 1); //随机数分布类,生成的随机数在0-1之间
    
        for (size_t i = 0; i < 10; ++i)
            cout << u(e) << ", "; //将u作为随机数源
    }
    
    int main()
    {
        RandPrint(time(0));
    
        return 0;
    }

     以上的uniform_int_distribution、uniform_real_distribution随机数分布对象都是均匀分布,我们还可以使用非均匀分布的随机数分布对象来生成非均匀随机数,如伯努利分布bernoulli_distribution、、正态分布normal_distribution等:

        default_random_engine e;
        bernoulli_distribution b(0.5); //以50%的概率生成true
        for (size_t i = 0; i < 10; ++i)
            cout << b(e) << ", ";
        //输出为1, 0, 0, 1, 1, 0, 1, 0, 0, 0

     随机数分布类还有一个成员函数reset(),它重建随机数分布对象的状态,使随后对该对象的使用不依赖于它已经生成的值。

  • 相关阅读:
    [转帖]SQL中partition关键字的使用
    利用分布类防止EF更新模型丢失验证信息
    列表样式切换
    HTML5页面增强元素
    CSS3 简易照片墙
    HTML5表单增强
    HTML5 元素拖放
    【CTF】WDCTF-2017 3-1 writeup
    【CTF】WDCTF-finals-2017 3-11 writeup
    【CTF】CTFHub 技能树 文件头检查 writeup
  • 原文地址:https://www.cnblogs.com/milanleon/p/8665084.html
Copyright © 2020-2023  润新知