c - 通过权重调整范围

标签 c function range

我创建了一个石头剪刀布的小游戏。我已经做到了,所以前 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/

相关文章:

python - ValueError : Length mismatch: Expected axis has 23 elements, 新值有 2 个元素。 Pandas 长度不匹配

css - 创建自定义输入类型范围跨浏览器

php - 在 PHP 中创建字母数字范围

java - 如何定义像素颜色的清晰范围

c - 为什么在启用 ASLR 时 glibc 的函数地址不随机化?

c - 何时转换 size_t

javascript - 访问 Javascript 原型(prototype)函数

c - 使用 C 中的指针在字符串数组中出现段错误

PHP Shell_Exec 不工作?

function - 局部函数可以在 Lua 中替换\覆盖自身吗