代码之家  ›  专栏  ›  技术社区  ›  Ian manuel aldana

模拟“命运之轮”(蒙特卡罗模拟命中或未命中法)

  •  3
  • Ian manuel aldana  · 技术社区  · 16 年前

    我正在尝试做一个随机发生器,它将使用蒙特卡罗命中或未命中模拟。

    我有一个表示ID和概率值的键值对:

    ID - Value
    2  - 0.37
    1 - 0.35
    4 - 0.14
    3 - 0.12
    

    您可以将这些值想象为“轮子”上“切片”的总面积(例如:ID 2占据轮子的37%,而ID 3只占据轮子的12%)。当转换为“范围”时,它将如下所示:

    ID - Value - Range
    2  - 0.37 - 0 to 37
    1 - 0.35 - 37 to 72
    4 - 0.14 - 72 to 86
    3 - 0.12- 86 to 100
    

    现在,我使用Random.NextDouble()生成一个介于0.0和1.0之间的随机值。该随机值将被视为车轮上的“旋转”。假设,随机化器返回0.35,那么将选择ID 2。

    如果我有一个双倍数组,实现这个的最佳方法是什么?

    5 回复  |  直到 16 年前
        1
  •  4
  •   rsp    16 年前

    最简单的解决方案往往是最好的,如果您的设计范围是0-100(或其他可管理的小数字),您可以分配一个 int[] 并使用您创建的范围表在相应索引处填写ID,您的“抛出”将如下所示:

    int randomID = rangesToIDs[random.nextInt(rangesToIDs.length)];
    

        2
  •  1
  •   atzz    16 年前

    现在你可以用 binary search

    求最高i,使P[i].q<=R那么P[i].id就是你的那一块。

        3
  •  0
  •   mariozski    16 年前

    因为jk写的分类词典应该没问题。

    零点三七二
    零点七二一
    零点八六四
    一点零零三

    如果xx<dict[i].键 返回dict[i].value

    或者我想到的另一个解决方案是包含上下限和值的自定义对象列表。然后遍历列表并检查滚动数是否在上下限范围内。

        4
  •  0
  •   jk.    16 年前

    以“Value”为键,以“ID”为值的已排序映射/字典将允许您快速找到所处范围的上限,然后查找该范围的ID

    假设你的字典允许,二进制搜索比遍历整本字典更好

        5
  •  0
  •   Martin DeMello    16 年前
    boundaries = [37, 72, 86, 100]
    num = 100 * random
    for i in boundaries:
      if num < i then return i