如何通过累积概率选择随机项目?

时间:2019-04-24 10:21:19

标签: c# math random probability

运动背景

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

我的问题

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

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

这是给定的概率表:

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个单元格中包含哪些项目。我想要作为答案的只是开始或解决此问题的方法,我仍然想自己尝试解决,请尽量避免使用完整的代码解决方案。

2 个答案:

答案 0 :(得分:0)

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

但是一般来说。如果您可以“以某种方式”生成介于0和1之间的随机数,那么问题就容易了,对吗?如果有一些条件,则可以选择给定此随机数的选项之一。

通过一点搜索,您可以轻松地找到如何以所需的任何语言生成随机数。

答案 1 :(得分:0)

在这种类型的问题中,我发现使用整数更容易,因此我将使用:

string url = "https://..../search.json?query=abc:123";

using (HttpClient client = new HttpClient())
{                 
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

    var content = await client.GetStringAsync(url);
    return JsonConvert.DeserializeObject<Object>(content);
}

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

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

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

依次解决各种可能性,并在达到所选选项时停止。我将使用伪代码,因为我的C ++非常生锈:

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