当前位置: 首页 > 知识库问答 >
问题:

根据可能性计算要执行的随机操作

束涵涤
2023-03-14

我有一个包含一些可能操作的枚举

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
  • 行动C60

我可以总结当前行动的前辈,并将得到这个结果

  • 行动A 0-30
  • 行动B 30-40
  • 行动CRest

但是我不知道如何通过代码计算动作。一些帮助会很棒。

这可能是

基于百分比的概率

但正如我之前提到的,可能的行动数量是未知的,所以我不能使用三个if语句。也许有一个技巧是使用一些数学来避免完全使用if语句。

共有2个答案

叶煌
2023-03-14

如果你在一个列表中有你的动作,并且想把你生成的随机数映射到正确的对象。你可以这样想:

林克:

actionsWithPossibilities
   .OrderBy(x => x.actionChancePercent) // Sort probabilities in increasing order
   .First(y => randomNumber <= y.actionChancePercent)
   // Find the correct 'bracket' by checking when the 
   // random number passes the thresholds.
谭桐
2023-03-14
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;
    }
}
 类似资料:
  • 我正在尝试根据枚举值检索一个值。基本上,假设我有以下枚举: 通过执行auth.key.get()将返回“MyKey”,而auth.mail.get()将返回“MyMail”。我搜索了一下,但没有找到答案,我之前没有尝试过任何事情,因为我完全不知道如何开始。谢谢,祝你有个愉快的一天

  • 问题内容: 对于如何找到执行以下操作的干净算法,我有些茫然: 假设我有一个dict k: 我现在想根据它们在总键(即总和)中所具有的“权重”,随机选择这些键之一。 所以有一个 选择A的百分比变化为24.81%。 您将如何编写可解决此问题的算法?换句话说,这确保了在10.000个随机选择中,A将被选择2.481次吗? 问题答案: 这是一个加权选择函数,其中包含一些行使它的代码。

  • 我正在尝试编写一行Ruby代码,用于计算文本冒险游戏中简单技能测试的可能成功率。测试是“如果x随机(12)= 在游戏中,玩家有一定的技能,并且偶尔必须测试这些技能加上一个随机数才能获得大于或等于给定难度的数字。我想计算能够赢得该技能测试的成功率百分比。 作为冒险游戏的一个例子,你试图在丛林中追踪一些动物。要做到这一点,你必须测试你的跟踪技能。例如,如果你的追踪技能为3,并且你在1-12之间添加了一

  • 我想看看哪个随机数生成器包在我的神经网络中更快。 我目前正在更改github的一个代码,其中两个都是numpy。随机和随机包用于生成随机整数、随机选择、随机样本等。 我之所以更改此代码,是因为出于研究目的,我希望设置一个全局种子,以便能够比较超参数不同设置的精度性能。问题是,现在我必须为随机包和numpy包设置两个全局种子。理想情况下,我只想设置一个种子,因为来自两个随机数生成器序列的图形可能会更

  • 计算机操作系统

  • 我试图让程序从列表中随机打印一个项目,然后程序要求用户在有真/假条件的地方输入一些信息,然后返回用户到起点,在那里他们可以选择一个新的“轨道” 我遇到的问题是,只有“listone”被选中,而不是随机的列表选择,这要归功于所有的帮助。