通过加权调整范围

时间:2016-02-15 20:14:36

标签: c function range

我创造了一款Rock Scissor Paper游戏。我已经做到这一点,所以前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++;
    }

1 个答案:

答案 0 :(得分:2)

对现有代码的一些观察:

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

    z = rand() / (1.0 + RAND_MAX);
    
  • 如果您有三个结果,则不需要五个限制。足以找到岩石和纸张以及纸和剪刀之间的中间限制。您也不需要检查范围的两侧,因为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
    }
    

至于你想要的分布:

  • 您可以通过分配概率来调整您的范围,以便只有一半的时间考虑玩家之前的动作:

    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;
    
  • 实现这一目标的另一种可能性是首先投掷硬币(几率为50%),然后使用头上的常规分布以及对玩家统计数据的反对(如代码中所示)。

    < / LI>
  • 如果到目前为止你保留了一系列玩家的动作,你可以选择一个过去的动作并为其选择正确的对策。