如何通过累积概率挑选随机物品?
How to pick random items through cumulative probability?
练习背景
该练习包括生成一个二维地图,用户给定该地图的 x,y 大小,然后将来自 table 的随机项目放置在地图的每个单元格上。
我在 Items 矩阵的 [x, y] 坐标中有一个单元格,我必须为此矩阵的每个单元格随机选择项目。
我的问题
我必须 select 从 table 的 4 个项目中随机选择项目,这些项目的概率以累积概率显示,并且具有此类项目的单元格可以有超过 1 个和不同的组合那些项目。
我真的不知道如何解决这个问题,考虑到其中 2 个项目在作业的给定 table 上具有相同的概率。
这是table给出的概率:
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。仔细检查概率table,但如果正确,则'Weapons'无效获得的选项。
不过一般。如果你能 'somehow' 生成一个介于 0 和 1 之间的随机数,问题就很简单了吧?通过一些 if 条件,您可以选择给定此随机数的选项之一。
只需稍加搜索,您就可以轻松找到如何以您想要的任何语言生成随机数。
我发现在这类问题中使用整数更容易,所以我将使用:
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
练习背景
该练习包括生成一个二维地图,用户给定该地图的 x,y 大小,然后将来自 table 的随机项目放置在地图的每个单元格上。 我在 Items 矩阵的 [x, y] 坐标中有一个单元格,我必须为此矩阵的每个单元格随机选择项目。
我的问题
我必须 select 从 table 的 4 个项目中随机选择项目,这些项目的概率以累积概率显示,并且具有此类项目的单元格可以有超过 1 个和不同的组合那些项目。
我真的不知道如何解决这个问题,考虑到其中 2 个项目在作业的给定 table 上具有相同的概率。
这是table给出的概率:
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。仔细检查概率table,但如果正确,则'Weapons'无效获得的选项。
不过一般。如果你能 'somehow' 生成一个介于 0 和 1 之间的随机数,问题就很简单了吧?通过一些 if 条件,您可以选择给定此随机数的选项之一。
只需稍加搜索,您就可以轻松找到如何以您想要的任何语言生成随机数。
我发现在这类问题中使用整数更容易,所以我将使用:
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