zoukankan      html  css  js  c++  java
  • 游戏中按概率播放某个音效简单c++实现

    熟悉xact的都知道一个cue可以对应多个sound。在播放某个cue的时候xact会按照每个sound播放概率进行选择某个sound然后进行下面的播放。

    在这里简单的使用rand进行一个模拟通过概率选择某一项的实现。

    假设有四个sound对应的概率分别为:

    A——%20

    B——%40

    C——%10

    D——%30

    假设100%概率的话,可以简单的指定0-100对应上面的每项的概率。

    A————对应100内的(0-19)20%

    B————对应100内的(20-59)40%

    C————对应100内的(60-69)10%

    D————对应100内的(70-99)30%

    这里使用rand()所求得出的概率尽管不能绝对的和上面类似20%这样精确,但基本上是可以做到按照给定的概率做出相应的选择的。

    下面是测试代码:

    void  main()
    {
        int ia(0),ib(0),ic(0),id(0);
        for(int i = 0;i<100;i++)
        {
            int n = rand() % 100;
            if(n<=19)
            {
                ia++;
                cout << "A"<<endl;
            }else if(n<=59)
            {
                ib++;
                cout << "B"<<endl;
    
            }else if(n<=69)
            {
                ic++;
                cout << "C"<<endl;
    
            }else
            {
                id++;
                cout << "D"<<endl;
            }
        }
    
        cout << "A=%"<<ia<<endl;
        cout << "B=%"<<ib<<endl;
        cout << "C=%"<<ic<<endl;
        cout << "D=%"<<id<<endl;
    
    
        system("pause");
    
    
    }

     今天在实际实现的时候发现了一些小问题,例如在使用rand()的时候,如果只获取一次的话,那它第一次执行的值永远是相同的,所以需要修改下逻辑。还有就是有可能让你通过概率选择的个数不固定,所以这些都是要考虑的范围。

    下面是修正版测试代码:

    struct stSound
    {
        string Name;
        int    weight;
    }
    
    string GetSelectName(vector<stSound> *vecSound)
    {
        int sum = 0;
        int ia = 0;
        vector<int> vecTemp;
        for(int i =0;i<vecSound.size();i++)
        {
            sum += vecSound.at(i).weight;
        }
    
        for(int i =0;i<vecSound.size();i++)
        {
            ia += ((vecSound.at(i).weight)*100) / sum;
            int nRange = ia;
            vecTemp.push_back(nRange);
        }
    
        srand((unsigned int)time(0));//解决rand()执行第一次值都相等的问题
        int iVlau = rand()%100;
        for(int i = 0;i<vecTemp.size();i++)
        {
            //解决通过概率选择的个数不固定的问题
            if(iVlau == vecTemp.at(i))
            {
                return vecSound.at(i).Name;
            }
        }
    
        return NULL;
    }

    效率上感觉不是很好,不过基本满足通过每项的权重计算概率,然后按照概率进行选择某一项了。

  • 相关阅读:
    XML(学习笔记)
    css样式学习笔记
    Request(对象)
    sql一些错误修改的总结
    转载(如何学习C#)
    sql server(学习笔记2 W3Cschool)
    sql sqrver(学习笔记1 W3Cschool)
    关于 flutter开发碰到的各种问题,有的已经解决有的一直没解决或者用其他方法替代
    关于 Flutter IOS build It appears that your application still contains the default signing identifier.
    关于 flutter本地化问题 The getter 'pasteButtonLabel' was called on null
  • 原文地址:https://www.cnblogs.com/wainiwann/p/3103359.html
Copyright © 2011-2022 走看看