0

全部用 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

4

3 回答 3

2

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

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

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

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

于 2013-09-26T21:11:13.450 回答
1
  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

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

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

于 2013-09-26T22:20:22.587 回答
0

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

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

于 2013-09-26T20:07:22.387 回答