当某些元素存在首选项值时,请选择随机元素

时间:2013-09-26 19:59:25

标签: c++ random

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

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

arrElem是一个数组,来自我必须选择的女巫和一系列偏好。 这个prefrence数组表示,对于元素数组中相应元素的首选项百分比/ 10 - 我想说:

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

首选项没有更高的界限,但如果它是10或更多,则自动选择相应的元素。 我似乎无法找到一种方法来编写一个可以通过这种方式选择元素的随机函数。

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

(100% - (所有首选项的总和* 10集合)/(集合中的元素数量))+(元素偏好* 10) 当(所有偏好的总和* 10集合)超过100

时,不知道该怎么处理这种情况

3 个答案:

答案 0 :(得分:2)

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

现在,选择0和你的总百分比之间的随机数(在这种情况下再次为1,000,000) - 1(即999,999)。

再次浏览您的列表。对于每个元素(包括第一个元素),添加每元素数量及其首选项数量。对于元素[0],您的总计将为125,000。如果您选择的随机数是< 125,000,那么这是你的选择。否则,继续下一个元素。现在我们的运行总数是125,000 + 125,000(每个元素)+ 200,000(此项目的首选项)或450,000。如果您选择的随机数是< 450,000,那么这是你的选择。

你需要一点额外的逻辑来总是选择最后一项,以防数学没有达到100%的数字。

答案 1 :(得分:1)

  1. 计算数组中元素的数量= N。

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

  3. 创建另一个维护每个分数的数组 原始数组中的元素。得分是:

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

    p是元素的首选项(0..10)

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

  5. 现在你准备工作了:

    1. 获取0到1之间的随机数R
    2. 扫描整数数组,使第一个条目大于或等于R.获取其索引i。
    3. 从元素数组中获取元素i。
    4. 你有自己的概率。

      得分/积分数组最好是双倍或浮点数,或者你可以使用一个大的(尽可能多的)基数,也许乘以1M ...... 请注意,您并不需要维护得分数组,因为您可以通过汇总每个得分进行整合而不保留得分。

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

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

      绘制数字时: 在步骤1中:获取0到10N之间的随机数R.

      这将使用整数来完成诀窍而不会失去准确性!

答案 2 :(得分:0)

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

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