当某些元素具有首选项值时,选择“随机元素” 全部用C++完成。 假设我有两个数组: int arrElem[]={1,2,3,4}; int arrPref[]={0,2,3,0};

当某些元素具有首选项值时,选择“随机元素” 全部用C++完成。 假设我有两个数组: int arrElem[]={1,2,3,4}; int arrPref[]={0,2,3,0};,c++,random,C++,Random,arrElem是我必须选择的元素数组和首选数组。 prefrence数组表示,比如说,在elements数组中,它对应的元素的偏好百分比为/10,我想说: 元素arrElem[0]=1没有首选项 元素arrElem[1]=2具有20%的优先权 元素arrElem[2]=3具有30%的优先权 元素arrElem[3]=4没有首选项 首选项没有上限限制,但如果它是10或更多,则会自动选择相应的元素。 我似乎找不到一种方法来编写一个随机化程序,以这种方式选择元素 编辑:阐明如何计算对象的机会: (

arrElem是我必须选择的元素数组和首选数组。 prefrence数组表示,比如说,在elements数组中,它对应的元素的偏好百分比为/10,我想说:

  • 元素arrElem[0]=1没有首选项
  • 元素arrElem[1]=2具有20%的优先权
  • 元素arrElem[2]=3具有30%的优先权
  • 元素arrElem[3]=4没有首选项
首选项没有上限限制,但如果它是10或更多,则会自动选择相应的元素。 我似乎找不到一种方法来编写一个随机化程序,以这种方式选择元素

编辑:阐明如何计算对象的机会:

(100%-(所有首选项之和*10在集合中)/(集合中的元素数))+(元素首选项*10)
当(所有首选项的总和*10)超过100时,我真的不知道该怎么办,所以在您的场景中,Arrement[1]有2/5的选择机会,第三个有3/5的选择机会


我想是的。您必须对所有首选项进行求和(以预加和),并在0和预加和-1之间创建一个随机变量。然后遍历所有首选项。如果
pref_sum-arrPref[i]那么在您的场景中,元素[1]有2/5的选择机会,第三个元素有3/5的选择机会


我想是的。您必须对所有首选项进行求和(以预加和),并在0和预加和-1之间创建一个随机变量。然后遍历所有首选项。如果
pref\u sum-arrPref[i]您必须在列表中进行几次迭代。第一次你把所有的“偏好”加起来,从100中减去,然后计算出你添加到每个元素的其余百分比。如果你想坚持整数,我想我会为你的“100%”选择一个相当高的数字,比如1000000。在上面的例子中,您有500000个首选项,然后您的每个元素得到(1000000-500000)/num[4]=125000

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

再看一遍你的清单。对于每个元素(包括第一个元素),添加每个元素的金额及其首选项金额。对于元素[0],您的运行总数将为125000。如果您选择的随机数小于125000,则这是您的选择。否则,请转到下一个元素。现在我们的运行总数是125000+125000(每个元素)+200000(此项目的首选项)或450000。如果您选择的随机数小于450000,则这是您的选择


你需要一点额外的逻辑来始终选择最后一项,以防计算结果与你的100%数字不完全一致。

你必须在列表中重复几次。第一次你把所有的“偏好”加起来,从100中减去,然后计算出你添加到每个元素的其余百分比。如果你想坚持整数,我想我会为你的“100%”选择一个相当高的数字,比如1000000。在上面的例子中,您有500000个首选项,然后您的每个元素得到(1000000-500000)/num[4]=125000

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

再看一遍你的清单。对于每个元素(包括第一个元素),添加每个元素的金额及其首选项金额。对于元素[0],您的运行总数将为125000。如果您选择的随机数小于125000,则这是您的选择。否则,请转到下一个元素。现在我们的运行总数是125000+125000(每个元素)+200000(此项目的首选项)或450000。如果您选择的随机数小于450000,则这是您的选择

你需要一点额外的逻辑来选择最后一项,以防计算结果与你的100%数字不符

  • 数组中元素的计数数=N

  • 统计首选项的数量(最多允许10个)=p

  • 创建另一个数组,为每个数组维护分数 原始数组中的元素。分数是:

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

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

  • 积分分数数组,使积分[i]=sum(分数[0]…分数[i]

  • 现在您可以开始工作了:

  • 获取一个介于0和1之间的随机数R
  • 扫描整数数组中第一个大于或等于R的条目。获取其索引i
  • 从元素数组中获取元素i
  • 你有你的可能性

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

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

    在步骤3:按如下方式计算分数: p*N+10-p

    图纸编号时: 在步骤1:获得0到10N之间的随机数R

    这将在不损失精度的情况下完成整型运算

  • 数组中元素的计数数=N

  • 统计首选项的数量(最多允许10个)=p

  • 创建另一个数组,为每个数组维护分数 元素。分数为:

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

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

  • 积分分数数组,使积分[i]=sum(分数[0]…分数[i]

  • 现在您可以开始工作了:

  • 获取一个介于0和1之间的随机数R
  • 扫描整数数组中第一个大于或等于R的条目。获取其索引i
  • 从元素数组中获取元素i
  • 你有你的可能性

    分数/积分数组最好是双精度或浮点型,也可以使用大的