两个不同的算法OPT和FIFO计算命中率和缺页率,为什么会得出相同的结果!!

问题相关代码,请勿粘贴截图
#include<iomanip>
#include <iostream>
using namespace std;

int tins = 320;//total instructions总指令数
int ins[320] = { -1 };//指令序列
int page[320] = { -1 };//页号
int men[33] = { -1 };//内存块
//指令序列用i
//页面序列用p
//内存块用m
//double hit = 0;//记录击中次数
//double miss = 0;//缺页次数
//int flag=0;//0 :hit;1:miss
//int mflag = 0;//是否写入空闲块



void init()
{
    srand((unsigned int)time(NULL));
    /*cout << "指令序列如下:" << endl;
    cout << "序号:指令地址" << endl;*/
    for (int i = 0; i < tins; i++)//F.重复步骤A-E,直到320次指令 while(i<320)
    {
        int m = rand() % tins;//A.随机选取起点m

        ins[i] = m + 1;//B.顺序执行m+1的指令  //写进指令序列
   //     cout <<setw(3)<<i<<":"<< setw(6) << ins[i] << endl;
        int m1 = rand() % (m + 1);//C.前地址[0,m+1]中随机选取一条指令并执行

        ins[++i] = m1;//写进指令序列
   //     cout << setw(3)<< i << ":" << setw(6) << ins[i] << endl;
        ins[++i] = m1 + 1; //D.顺序执行一条指令,其地址为m0+1,写进序列
   //     cout << setw(3) << i << ":" << setw(6) << ins[i] << endl;
        int m2 = rand() % (tins - m1 - 2) + (m1 + 2);//E.后地址[m’+2319]中随机选取一条指令并执行
        ins[++i] = m2;//写进序列
   //   cout << setw(3) << i << ":" << setw(6) << ins[i] << endl;
    }

    //指令对应页面号 
    for (int i = 0; i < tins; i++)
    {
        page[i] = ins[i] / 10;
        cout << page[i] << endl;
    }

}

void FIFO()
{
    double h1 = 0;//记录击中次数
    double m1 = 0;//缺页次数
    int flag = 0;//0 :hit;1:miss
    int mflag = 0;//是否写入空闲块

    int count = 0;
    //每次使用新算法 都要将内存块置空
    for (int m = 3; m < 32; m++)
    {
        men[m] = -1;//不能为0,如果为0,代表第0页已经被写入内存
    }
    //如果men[5]=1,说明,第6内存块放入了第一页
    //大循环 执行320条指令
    for(int i=0;i<tins;i++)
    {
        flag = 0;
        //假设hit
        for (int m = 3; m < 32; m++)
        {
            if (men[m] == page[i])
            {
                h1++;
                //给一个标志,方便后续是否需要将该页写入内存
                flag = 1;//在内存中
                break;
            }
        }
         if (flag == 0)//不在内存中
         {  
                m1++;
                //缺页中断
                //扫描内存块,如果有空闲块,就写入该页
                for (int m = 3; m < 32; m++)
                {
                    if (men[m] == -1)//如果是空闲的,就把它写进去
                    {
                        men[m] = page[i];
                        //写完就可以退出扫描
                        mflag = 1;//虽然缺页,但是有空闲块,标志已写入内存
                        //怎么退呢?
                        break;
                        //感觉这里可以做一个输出,看看内存块存了哪页
                    }  
                }
               //如果没有空闲块,采用先进先出置换法,置换某页 
                if(mflag==0)
                {//第一次置换第4块,下一次置换要加1 ;直到置换到32块,再重新从第四块开始置换   
                        men[3+count] = page[i]; 
                        count++;
                        if (count == 28) 
                        { 
                            count = 0; 
                        }
                 }
                
         }   
        
    }
    //输出命中次数和缺页次数
    cout << "命中次数:"<< h1 << endl;
    cout << "缺页次数:"<<m1 << endl;
    //计算缺页率和命中率
    double ph1 = h1 / tins;
    double pm1 = m1 / tins;
    cout << "命中率:" << ph1 << endl;
    cout << "缺页率:" << pm1 << endl;
}

void OPT()
{
    double hit = 0;//记录击中次数
    double miss = 0;//缺页次数
    int flag = 0;//0 :hit;1:miss
    int mflag = 0;//是否写入空闲块

   
    //每次使用新算法 都要将内存块置空
    for (int m = 3; m < 32; m++)
    {
        men[m] = -1;
    }
    for (int i = 0; i < tins; i++)
    {
        
        for (int m = 3; m < 32; m++)
        {
            if (men[m] == page[i])
            {
                hit++;
                flag = 1;
                break;
            }
            else { flag = 0; }
        }
        if (flag == 0)
        {
            miss++;
            for (int m = 3; m < 32; m++)
            {
                if (men[m] == -1)
                {
                    men[m] = page[i];
                    mflag = 1;//找到空闲块
                    break;
                }
            }
            if (mflag == 0)//没有空闲块 采用最佳置换算法:置换未来一段时间用不到的内存块
            {
                int record[33] = { -1 };
                bool re[320] = { false };
                for (int m = 3; m < 32; m++)//从第四块开始扫描到32块
                {                                         
                    for (int str = i; str < tins; str++)//从当前执行的指令开始扫描
                    {//从当前指令开始扫描到最后一条指令
                        if (men[m] == page[str])//扫描到某页在内存块
                        {
                            if(re[m]==false)
                            {
                                record[m] = str - i;//  记录距离下次再用到这块的时间值
                                re[m] = true;//,扫到一个相同的就行
                            }
                        }
                        else {
                            record[m] = INT_MAX;
                        }
                    }
                }         
                //扫描结束 每个块距离后面再用到的时间值已经计算结束
                //从中找一个时间值最大的置换
                int max = record[3];
                int k=3;
                for (int m = 3; m <32; m++)
                {
                    if (record[m] > max)
                    {
                        max = record[m];
                        k = m;
                        
                    }
                }
                men[k] = page[i];
                //找到时间值最大的内存块,把这块换出去
               
            }
             
        }
    }
    //输出命中次数和缺页次数
    cout << "命中次数:" << hit << endl;
    cout << "缺页次数:" << miss << endl;
    //计算缺页率和命中率
    double ph = hit / tins;
    double pm = miss / tins;
    cout << "命中率:" << ph << endl;
    cout << "缺页率:" << pm << endl;
}

检查代码,循环结构是否有问题

你换个数据再测试呢,可能正好巧合了