C 通过加权调整范围

C 通过加权调整范围,c,function,range,C,Function,Range,我已经创造了一个小游戏的岩石剪刀纸。我这样做是为了让前10个游戏都是由计算机随机移动(基于0-100之间的随机数,在等分范围内)来响应的 然而,在第二组10个游戏中,我希望计算机的响应根据玩家对前10个游戏的响应进行加权。 我在下面写了这篇文章,但是它应用了100%的权重 我只想对这个范围应用50%的权重,你有什么想法可以用最简单的方法来实现这一点 这是我写的一个函数,所以它只是代码的一部分 int z; float range[5]; float player_r, p

我已经创造了一个小游戏的岩石剪刀纸。我这样做是为了让前10个游戏都是由计算机随机移动(基于0-100之间的随机数,在等分范围内)来响应的

然而,在第二组10个游戏中,我希望计算机的响应根据玩家对前10个游戏的响应进行加权。 我在下面写了这篇文章,但是它应用了100%的权重

我只想对这个范围应用50%的权重,你有什么想法可以用最简单的方法来实现这一点

这是我写的一个函数,所以它只是代码的一部分

    int z;
    float range[5];
    float player_r, player_s, player_p, games;

    player_r = (float)playertotal_R;
    player_s = (float)playertotal_S;
    player_p = (float)playertotal_P;

    games = (float)totalgames;

    z = rand() % 101;

    range[0] = player_s / games * 101.0;
    range[1] = range[0] + 0.1;
    range[2] = (range[0]) + (player_p / games * 100.0);
    range[3] = range[2] + 0.1;
    range[4] = 100.0;


    if (z <= range[0]) {
        strcpy(compresponse[w], "r");
        computertotal_R++;
    } else if ((z >= range[1]) && (z <= range[2])) {
        strcpy(compresponse[w], "s");
        computertotal_S++;
    } else if ((z >= range[3]) && (z <= range[4])) {
        strcpy(compresponse[w], "p");
        computertotal_P++;
    }
intz;
浮动范围[5];
浮动玩家r,玩家s,玩家p,游戏;
玩家=(浮动)玩家总数;
玩家=(浮动)玩家总数;
玩家p=(浮动)玩家总玩家p;
游戏=(浮动)总游戏;
z=rand()%101;
范围[0]=玩家/游戏*101.0;
范围[1]=范围[0]+0.1;
范围[2]=(范围[0])+(玩家/游戏*100.0);
范围[3]=范围[2]+0.1;
范围[4]=100.0;

如果(z=range[1])&&(z=range[3])&(z对现有代码的一些观察:

  • 由于您的范围是有理数,因此最好不要生成0到99之间的整数,而是生成0到1之间的随机浮点数(独占):

  • 当你有三个结果时,你不需要五个极限。在石头和纸、纸和剪刀之间找到中间极限就足够了。你也不需要检查范围的两边,因为较低的那一边已经被
    else

    double prob_rock = 1.0 / 3.0;
    double prob_paper = 2.0 / 3.0;
    
    if (z < prob_rock) {
        // Rock
    } else if (z < prob_paper) {
        // Paper
    } else {
        // Scissors
    }
    
    或在上述示例中:

    double prob_rock = 0.5 * npaper / games + 0.5 / 3.0;
    double prob_paper = 0.5 * nscissors / games + 1.0 / 3.0;
    
  • 另一种可能是先掷一枚硬币(50%的概率),然后在头部使用规则分布,然后对玩家的统计数据(如代码中的统计数据)进行反击

  • 如果到目前为止你保留了玩家的一系列招式,你只需选择一个过去的招式并为其选择正确的反击


谢谢Oehm。信息量大,帮助很大:)谢谢
p[move] = 0.5 * p[countermove] + 0.5 * p[regular]
double prob_rock = 0.5 * npaper / games + 0.5 / 3.0;
double prob_paper = 0.5 * nscissors / games + 1.0 / 3.0;