gpt4 book ai didi

c - 通过权重调整范围

转载 作者:行者123 更新时间:2023-11-30 18:52:01 25 4
gpt4 key购买 nike

我创建了一个石头剪刀布的小游戏。我已经做到了,所以前 10 场游戏是在计算机以随机 Action 进行响应的情况下进行的(基于 0-100 之间的随机数,落在均分范围内)。

但是,在第二组 10 场比赛中,我希望根据玩家对前 10 场比赛的 react 对计算机响应进行加权。我在下面写了这个,但它应用了 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++;
}

最佳答案

对现有代码的一些观察:

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

    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
    }

至于您想要的分布:

  • 您可以调整范围,以便通过分配概率,仅在一半的时间内考虑玩家之前的 Action :

    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% 的机会),然后使用正面的正则分布,然后对玩家的统计数据(如您的代码中所示)进行反制。

  • 如果您保留了玩家到目前为止的一系列 Action ,您只需选择过去的一个 Action 并为其选择正确的反击即可。

关于c - 通过权重调整范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com