【问题标题】:How to pick random items through cumulative probability?如何通过累积概率选择随机项目?
【发布时间】:2019-09-13 14:46:14
【问题描述】:

运动背景

该练习包括生成一个 2D 地图,用户给定该地图的 x,y 大小,然后将表格中的随机项目放置在地图的每个单元格上。 我在 Items 矩阵的 [x, y] 坐标中有一个单元格,我必须为该矩阵的每个单元格随机挑选项目。

我的问题

我必须从一个包含 4 个项目的表中选择随机项目,这些项目的概率以累积概率显示,并且包含此类项目的单元格可以有多个项目以及这些项目的不同组合。

我真的不知道如何解决这个问题,考虑到有 2 个项目在给定的作业桌上有相同的概率。

这是给出的概率表:

Food - 1
Weapons - 0.5
Enemy - 0.5
Trap - 0.3

我的项目枚举:

[Flags]
enum Items
{
    Food = 1<<0,
    Weapon = 1<<1,
    Enemy = 1<<2,
    Trap = 1<<3
}

同样,预期的输出是通过这个百分比随机选择 1 个单元格有哪些项目。我想要的答案只是一个开始或解决这个问题的方法,我仍然想自己尝试做,如果可以的话,避免使用完整的代码解决方案。

【问题讨论】:

  • 在 0 和 2.3 之间选择一个随机数,然后使用累积概率:食物 - 1 武器 - 1.5 敌人 - 2.0 陷阱 - 2.3 所以武器会在 1 和 1.5 之间
  • 您能否进一步解释您所说的“具有此类项目的单元格可以有多个项目以及这些项目的不同组合”是什么意思?
  • @Megadardery 我的意思是我解释的矩阵的每个元素都可以在其中随机选择一个以上的项目,因此您可以使用食物+敌人或武器+陷阱的组合.
  • 如果是这种情况,那么这些不是选择替代品的累积概率,它们可能是选择每个项目的个体概率。换句话说,每个细胞都应该有食物,一半的细胞应该有武器,一半的细胞应该有敌人,平均30%的细胞应该有陷阱。如果是这样,那么您接受的答案将是错误的,因为它仅在每个单元格中选择一项。

标签: c# math random probability


【解决方案1】:

我发现在这类问题中使用整数更容易,所以我将使用:

Food - 10
Weapons - 5
Enemy - 5
Trap - 3

总共有 10 + 5 + 5 + 3 = 23 个可能的选项。

大多数计算机 RNG 从 0 开始工作,因此将 23 个选项(如 0..22)拆分如下:

Food - 0..9 giving 10 options.
Weapons - 10..14 giving 5 options.
Enemy - 15..19 giving 5 options.
Trap - 20..22 giving 3 options.

按顺序处理各种可能性,当您到达所选选项时停止。我将使用伪代码,因为我的 C++ 非常生锈:

function pickFWET()

  pick <- randomInRange(0 to 22);

  if (pick < 10) return FOOD;
  if (pick < 15) return WEAPONS;      
  if (pick < 20) return ENEMY;
  if (pick < 23) return TRAP;

  // If we reach here then there was an error.
  throwError("Wrong pick in pickFWET");

end function pickFWET

【讨论】:

    【解决方案2】:

    如果两个物品的累积概率相同,则获得后一个物品的概率为0。仔细检查概率表,但如果正确,则“武器”不是一个有效的获得选项。

    但总的来说。如果你能“以某种方式”生成一个介于 0 和 1 之间的随机数,那么问题就很简单了,对吧?使用一些 if 条件,您可以在给定此随机数的情况下选择其中一个选项。

    通过一些搜索,您可以轻松找到如何以您想要的任何语言生成随机数。

    【讨论】:

    • 是的,生成数字很容易。乍一看,这张桌子看起来不对,但我认为这是我不记得的东西丢失了,因为如果武器和敌人具有相同的概率,如果表格是累积概率,那么其中一个实际上是不可能的
    猜你喜欢
    • 2011-02-15
    • 2012-03-08
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多