如何计算应用奖金的机会(即暴击几率)?

时间:2017-06-01 17:57:16

标签: c

对不起,如果问题不清楚,英语不是我的主要语言,所以我不知道如何撰写。我的老师做了一个练习来计算谁将在决斗中赢得他们的健康和攻击。我想稍微扩大一点,增加护甲,重要机会和致命伤害作为额外的统计数据,现在我试图弄清楚如何应用伤害中的关键几率。这是我到目前为止的地方。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int HP;
    int damage;
    int armor;
    float crit_damage;
    float crit_chance;
} atributes;

//how to implement crit_chance?
//using a function?
//divide 100 for the crit_chance
//Ex: crit_chance = 25 ; 100/25 = 4
//generate a random number between 1 and 4
//if the number is 4 the crit_chance is sucessfull
//if not then the crit_chance fails
//aply then the result of the funcion to character[i].crit_damage

int main() {
    int i, rounds = 0;
    atributes character[2];

    for(i = 0; i < 2; i++) {
        printf("\tCharacter %d atributes\n", i+1);
        printf("    Damage = ");
        scanf("%d", &character[i].HP);
        printf("    HP = ");
        scanf("%d", &character[i].damage);
        printf("    Armor = ");
        scanf("%d", &character[i].armor);
        printf("    Crit Damage = ");
        scanf("%f", &character[i].crit_damage);
        printf("    Crit Chance = ");
        scanf("%f", &character[i].crit_chance);
        printf("\n");
    }

    while ((character[0].HP > 0) || (character[1].HP > 0)) {
        character[0].HP -= (character[1].damage * (character[1].crit_damage) - character[0].armor * 2);
        character[1].HP -= (character[0].damage * (character[0].crit_damage) - character[1].armor * 2);
        rounds++;
    };

    if (character[0].HP > character[1].HP) printf("\tCharacter 1 won after %d rounds!", rounds);
        else if (character[0].HP < character[1].HP) printf("\tCharacter 2 won after %d rounds!", rounds);
            else printf("\tThe duel ended in a tie after %d rounds", rounds);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

以下作品:

int is_critical = (rand()%4==3);

rand()stdlib.h提供的函数,它返回0RAND_MAX之间的值(stdlib.h中定义的常量)。

rand()%4会在此值除以4时给出余数:这将是数字0,1,2或3。

要求rand()%4==3询问结果是否等于3(尽管你也可以选择0,1或2)。由于3代表结果的25%,因此对应于您想要的内容,如果有is_critical,则RAND_MAX为1。

但需要注意的是,由于int is_critical = (rand()/(float)RAND_MAX)>0.75; 可能无法被4整除,因此某些模数结果的发生几率略高,因此您永远不会想要生成对于任何真正重要的事情(科学,金融,加密和&amp; c),这种随机数字。

您可以按如下方式推广此方法:

rand()

由于RAND_MAXRAND_MAX都给出了整数且rand()大于RAND_MAX,因此除以它们为0.所以我们将$> gcloud auth print-access-token ya29.GlxcBCtxyP3xW1JwKL62vh4h_8W0vqH9awoCXgcYkOguBP2DKc4JxgHpX6HHuaaaaaaaaaaaaa 转换为浮点数。结果是&#34;统一&#34;分布数在0-1范围内。这大于0.75,有25%的几率,这就是你想要的。