视觉C++计算事件的概率

visual C++ computing a probability for an event

本文关键字:概率 事件 计算 C++ 视觉      更新时间:2023-10-16

我正在尝试模拟野生口袋妖怪的遭遇。如公式所述:

The rate of Pokémon encounter is determined from a simple mathematical formula:
1 in (187.5 / ( x )) per step.
Let x equal the a value which determines how rare the Pokémon is. The higher the encounter rate, 
the more common the Pokémon is.
Encounter-rate Table
Encounter type Encounter rate
Very common     10
Common          8.5
Semi-rare       6.75
Rare            3.33
Very rare       1.25

我想在每次按下按钮后运行这个概率。我如何使用rand()模拟这一点?

我会这样做

映射 rand()

rand() / (float)RAND_MAX

Rand()返回一个介于 0 到RAND_MAX之间的值,因此此公式0 -> RAND_MAX映射到0 -> 1

(float) 用于使RAND_MAX成为浮点数,因为rand()返回的值是一个int,而 C++ 中的int / int返回一个int

(rand() / (float)RAND_MAX) * 10 

如果将结果乘以 10,它将映射rand()0 -> 10

(rand() / (float)RAND_MAX) * 187.5

这将映射0 -> 187.5rand()

1在187.5

我们从0 -> 187.5映射了rand()的值

现在每次我们调用rand()它都会从0->187.5返回一个随机数

为了简化起见,假设我们从0 -> 200映射rand()

rand()返回低于 100 的数字的可能性为 1/2,因为 0 -> 200 之间的每个数字都有相同的返回机会(例如rand()可以返回 25.67 或 100.9 或 140.6)

( (rand() / (float)RAND_MAX) * 187.5 ) < 1

根据相同的原理,返回的数字小于 1 的几率为 187.5

最终解决方案

我们仍然缺少 1 in 187.5/X

要实现遭遇率,您只需要将映射从0 -> 187.5更改为

0 -> 187.5 / X

我们可以看到,如果 X 很大,则意味着存在较高的遭遇率,并且 187.5 变小,返回的数字小于 1 的几率更高,但如果遭遇率低,X 变小,187.5 变大(小于 1 的几率较低)

最终代码

srand (time(NULL)); // Init rand() with a seed
bool encountered = ( (rand() /  (float)RAND_MAX) * (187.5 / x) ) < 1

优化

一位用户指出,使用最后一个代码,您需要为每个事件计算 5 个 rand(),但如果我们稍微调整一下公式,您只能计算 1 个rand()

通过使用简单的数学,您知道在 10/2 个步骤中发生一次 (1) 的事件 是在 (2) 中 10 个步骤中发生两次的事件

因此,在 187.5/X 步中发生一次 (1 * X) 的事件在 187.5 步中发生 (1 * X)

如果我们从 0 -> 187.5 映射 rand() 那么对于每个口袋妖怪,我们可以仅使用一个 rand() 为其计算一个唯一值

float randomNumber      = (rand() / (float)RAND_MAX) * 187.5
bool encountedPokemon1  = randomNumber < 1 * encounter_rate_first_pokemon
bool encountedPokemon2  = randomNumber < 1 * encounter_rate_second_pokemon

使用取模运算符。 rand() 将返回一个介于 0 和整数可以容纳的最高值之间的数字。 所以 rand()%10 将返回一个介于 0 和 9 之间的数字。

(rand()%1875) <= 10 应该为真 187.5 次中有 1 次(或 1875 次中有 10 次)

如果您还不知道,% 会给您剩余的。所以 x%10 永远不能大于 9。

这是一个参考