【问题标题】:Choose random element when there are preference values for certain elements当某些元素有偏好值时选择随机元素
【发布时间】:2013-09-26 19:59:24
【问题描述】:

全部用 C++ 完成。 假设我有两个数组:

int arrElem[]={1,2,3,4};
int arrPref[]={0,2,3,0};

arrElem 是一个数组,其中包含我必须选择的女巫的元素和一个偏好数组。 prefrence 数组表示,比方说,它是元素数组中相应元素的偏好百分比/10 - 我想说的是:

  • 元素 arrElem[0]=1 没有偏好
  • 元素 arrElem[1]=2 有 20% 的偏好
  • 元素 arrElem[2]=3 有 30% 的偏好
  • 元素 arrElem[3]=4 没有偏好

首选项没有更高的限制,但如果它是 10 或更多,则会自动选择它对应的元素。 我似乎无法找到一种方法来编写一个随机化器来以这种方式选择元素。

编辑:澄清如何计算对象的机会:​​

(100% - (集合中所有偏好的总和*10)/(集合中元素的数量))+(元素偏好*10) 当(集合中所有偏好的总和*10)大于 100 时,真的不知道该怎么办

【问题讨论】:

标签: c++ random


【解决方案1】:

您必须对列表进行几次迭代。第一次将所有“偏好”相加时,从 100 中减去,然后计算出添加到每个元素的其余百分比。如果你想坚持使用整数,我想我会为你的“100%”选择一个相当高的数字,比如 1000000。所以在你上面的例子中,你有 500,000 的偏好,那么你的每个元素得到 (1,000,000 - 500,000 ) / num [4] = 125,000。

现在,在 0 和您的总百分比(在本例中为 1,000,000)- 1(即 999,999)之间选择一个随机数。

再次浏览您的列表。对于每个元素,包括第一个元素,添加每个元素的数量及其偏好数量。对于 element[0],您的运行总数将为 125,000。如果您选择的随机数

您需要一些额外的逻辑来始终选择最后一项,以防数学无法准确得出您的 100% 数字。

【讨论】:

  • 您的回答很有帮助。现在我正在努力解决另外两个问题:-当元素数量变化时-当所有偏好的减法小于 0 时有任何提示吗?
  • 编辑:好的,我已经处理了元素数量变化的情况。仍然没有关于另一个的线索。
  • 我不确定要告诉你关于所有偏好的内容。我想我会做的是将所有偏好加起来并将它们标准化为 100%,这样它们至少彼此之间的关系是相同的。因此,在首选项 {0, 1, 2, 3, 4, 5, 0} 的示例中,您的每个元素数量将为 0,并且您的首选项乘数而不是 100,000(按照我在示例中编写的方式)取而代之的是 (1,000,000 / total_pref [15 here]) 或 66666 每个“偏好”。这将为您提供大致的偏好相对于彼此的比率。
  • 基本上,您只是动态计算它,而不是使偏好数量保持不变(在我的示例中为 100,000)。我猜逻辑将在第一个循环之后,如果偏好
  • 帮助很大,谢谢。哦,这是我的蚁群优化算法实现的一部分。更准确地说,蚂蚁选择它的路径的部分 - 元素是在特定时刻可用的图节点,而偏好是节点路径的信息素值。
【解决方案2】:
  1. 数组中元素的计数 = N.

  2. 首选项计数(最多允许 10 个)= P.

  3. 为每个数组创建另一个保持分数的数组 原始数组中的元素。分数是:

    (1-0.1*P)/N + (p*0.1)

    p 是元素的偏好 (0..10)

  4. 整合分数数组,使得 Integrated[i]=sum(score[0]…score[i]

现在您可以开始工作了:

  1. 获取一个随机数,R,介于 0 和 1 之间
  2. 扫描整数数组以查找大于或等于 R 的第一个条目。获取其索引 i。
  3. 从元素数组中获取元素 i。

你得到了你的概率。

分数/积分数组最好是双精度或浮点数,或者您可以使用大的(尽可能多的)基数,也许乘以 1M.... 请注意,您实际上并不需要维护分数数组,因为您可以通过对每个分数求和而不保留分数来进行积分。

编辑: 如果要在不损失精度的情况下使用整数进行积分,可以更改为以下内容:

在第 3 步中:计算分数如下: p*N + 10 - P

绘制数字时: 第一步:获取0到10N之间的随机数R。

这将在不损失准确性的情况下使用整数!

【讨论】:

    【解决方案3】:

    那么在您的场景中 arrElement[1] 有 2/5 的选择机会,而第三个选择的机会是 3/5?

    我会这么认为。您必须将所有偏好相加(到 pref_sum)并在 0 和 pref_sum-1 之间创建一个随机变量。然后遍历所有首选项。如果pref_sum-arrPref[i]<0 则选择第i 个元素作为结果;否则减去偏好:pref_sum-=arrPref[i]

    【讨论】:

    • 不,因为这样 arrElem[0] 和 arrElem[4] 没有机会被选中。正如我在上面的其中一个 cmets 中所说,arrElem[1]=2 的概率为 [100%-(20%+30%)/4]+20%=12.5%+20%=32.5%
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多