c# - 根据可能性计算要执行的随机动作
问题描述
我有一个包含一些可能操作的枚举
internal enum Action
{
Stay,
MoveLeft,
MoveRight
}
和一个对象,该对象保存有关此操作的当前机会的信息
internal class ActionWithPossibility
{
public Action Action { get; }
public int ActionChancePercent { get; }
public ActionWithPossibility(Action action, int actionChancePercent)
{
Action = action;
ActionChancePercent = actionChancePercent;
}
}
机会从 0 到 100。带有机会的动作集合可能是
List<ActionWithPossibility> actionsWithPossibilities = new List<ActionWithPossibility>() {
new ActionWithPossibility(Action.Stay, 40),
new ActionWithPossibility(Action.MoveLeft, 30),
new ActionWithPossibility(Action.MoveRight, 30)
};
或者
List<ActionWithPossibility> actionsWithPossibilities = new List<ActionWithPossibility>() {
new ActionWithPossibility(Action.Stay, 30),
new ActionWithPossibility(Action.MoveLeft, 10),
new ActionWithPossibility(Action.MoveRight, 60)
};
或者
List<ActionWithPossibility> actionsWithPossibilities = new List<ActionWithPossibility>() {
new ActionWithPossibility(Action.Stay, 30),
new ActionWithPossibility(Action.MoveLeft, 60),
new ActionWithPossibility(Action.MoveRight, 10)
};
有两个重要的事情:
- 可能性的总和将是 100。
- 或多或少的行动是可能的。所以行动的数量是未知的。
通过此方法调用随机操作时
public void NextAction(List<ActionWithPossibility> actionsWithPossibilities)
{
int randomNumber = random.Next(0, 100);
// ...
Action targetAction = null; // ?
}
有没有办法计算动作(不使用ifs)?我想到了这个设置:
- 行动 A 30
- 行动 B 10
- 行动 C 60
我可以总结一下当前动作的前辈,会得到这个结果
- 动作 A 0 - 30
- 行动 B 30 - 40
- 动作 C 休息
但我不知道如何通过代码计算动作。一些帮助会很棒。
这可能是
但正如我之前提到的,可能的操作数量是未知的,所以我不能选择三个 if 语句。也许有一个技巧可以使用一些数学来完全避免 if 语句。
解决方案
int threshold = 0;
int randomNumber = random.Next(0, 100);
for (var i = 0; i < actionsWithPossibilities.Count; i++)
{
var item = actionsWithPossibilities[i];
threshold += item.ActionChancePercent;
if (randomNumber <= threshold)
{
//first action that's under the defined threshold is placed in result
result = item.Action;
break;
}
}
推荐阅读
- excel - 从日期匹配年份和季度并粘贴值
- c# - C#应用程序设置变量不起作用
- python - spaCy retokenizer 是否再次进行依赖解析?
- ios - 迅速。addSubview 点击监听器后不起作用
- laravel - Laravel 路由仅在 phpunit 测试期间返回 302 而不是 404 响应
- react-native - 单击输入时,固定在底部的按钮出现在反应本机android的键盘上
- amazon-web-services - 如何在 ApiGateway 中获取根资源的资源路径?
- node.js - 无法从 React-ExpressJS 应用程序 CRUD 删除请求中正确删除我的数据
- android - 取决于响应的 Android 动态 UI
- python - 使用python从API中提取完整数据为Json格式