• 第五章


     C++ 库有一个名为 rand() 的函数,每次调用该函数都将返回一个非负整数。要使用 rand() 函数,必须在程序中包含 <cstdlib> 头文件。但是,该函数返回的数字其实是伪随机数。这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是用算法生成的。

    该算法需要一个起始值,称为种子,以生成数字。如果没有给出一个种子,那么它将在每次运行时产生相同的数字流

    要在每次运行程序时获得不同的随机数字流,则必须为随机数生成器提供一个种子以开始。在 C++ 中,这是通过调用 srand 函数完成的。

    在 rand 被调用之前,srand 函数要先被调用,并且 srand 在整个程序中仅被调用一次。

    # include <iostream>
    # include <cstdlib>
    
    using namespace std;
    
    int main(){
        unsigned seed;
        while (true){
            cin >> seed;
            srand(seed);
            cout << rand() << endl;
            cout << rand() << endl;    
        }
    }

    从程序的输出可以看出,每次程序使用不同的种子运行时,都会生成不同的随机数字流。然而,如果再次使用 19 或 171 作为种子运行程序,则将获得与第一次完全相同的数字。

    实际上,获取种子值的另一个常见做法是调用 time 函数,它是 C++ 标准库的一部分。

    time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。下面程序演示了 time 函数的用法。请注意,在调用它时必须给它传递一个参数 0。同时程序中包含一个新的头文件 ctime,此头文件是使用 time 函数所必需的。

    # include <iostream>
    # include <cstdlib>
    # include <ctime>
    
    using namespace std;
    
    int main(){
        // 使用循环模拟拳皇对战 
        /** HP */ 
        int hp1 = 100;
        int hp2 = 100; 
        
        int attack1 = 0;   // 八神的攻击力 
        int attack2 = 0;   // 草稚京的攻击力
        int randNum;       //用来存放玩家攻击先后的随机数变量
        
        srand(time(NULL));
        // 当双方都生存的时候,继续战斗过程
        while (hp1 > 0 && hp2 > 0) {
            // 1.模拟玩家出招:可以采用随机数是奇偶决定谁先出招
            // 奇数--八神   偶数--草稚京先
            randNum = rand();
            //cout << RAND_MAX << endl;
            if (randNum % 2 == 1){
                attack1 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
                attack2 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
                
                hp2 -= attack1;
                hp1 -= attack2;        
            }
            else{
                attack1 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
                attack2 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
                
                hp1 -= attack2;
                hp2 -= attack1;
            }
            
        }
    
        //打印对战的最终结果
        cout << "八神庵:"  << hp1 << endl; 
        cout << "草稚京:"  << hp2 << endl;
        cout << rand() << endl;  
    }

    调试:

    1. 分析错误
    2. 设置断点
    3. 启动调试
    4. 单步运行
    5. 观察变量
    6. 发现问题
    7. 修正代码重新运行

    do-while循环:

    特点:先执行,在判断

    • 先执行一遍循环操作
    • 符合条件,循环继续
    • 否则循环退出

    while循环和do-while循环的区别

    • 执行顺序不同
    • 初始情况不满足循环条件时:
      • while循环一次都不会执行
      • do-while循环不管任何情况都至少执行一次

  • 相关阅读:
    使用BigQuery分析GitHub上的C#代码
    ASP.NET Core 处理 404 Not Found
    C# 7 局部函数剖析
    调试 ASP.NET Core 2.0 源代码
    Entity Framework Core Like 查询揭秘
    ASP.NET Core Razor 视图组件
    Thread 1 cannot allocate new log引起的宕机事故(转载)
    docker默认网段和主机网段冲突解决
    docker安装异常以及网络问题总结
    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  • 原文地址:https://www.cnblogs.com/jiangzijiang/p/14744667.html
Copyright © 2020-2023  润新知