视觉C++计算事件的概率
visual C++ computing a probability for an event
我正在尝试模拟野生口袋妖怪的遭遇。如公式所述:
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.5
rand()
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。
这是一个参考
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 如何根据单词在文本中出现的概率输出单词
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- Windows 进程间同步类似事件?
- 如何从C++端挂接到 QML 项的 onClick 事件
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- C++ 信号和插槽不工作:插槽不响应事件
- 视觉C++计算事件的概率