用于从列表中挑选的C ++函数,其中每个元素具有不同的概率

时间:2010-04-15 23:42:00

标签: c++ random probability

我有一个结构数组,结构中的一个字段是一个浮点数。我想选择一个结构,其中拾取它的概率是相对于浮点数的值。即

struct s{
  float probability;
  ...
}

s sArray[50];

决定选择哪个s的最快方法是什么?这有功能吗?如果我知道所有概率字段的总和(注意它不会是1),那么我可以迭代每个s并将probability/total_probability与随机数进行比较,改变每个s的随机数吗?即

if( (float) (rand() / RAND_MAX) < probability)...

2 个答案:

答案 0 :(得分:9)

float p = (rand() / static_cast<float>(RAND_MAX)) * total_probability;
s* current = &sArray[0];
while ( (p -= current->probability) > 0)
    ++current;
// `current` now points to your chosen target

答案 1 :(得分:3)

按照你的说法找出RAND_MAX。 生成最多RAND_MAX的随机数。 迭代数组计算概率,直到等于或超过生成的随机数。 (只有50个元素的性能不应该是一个问题,否则将概率的总和存储在另一个数组中,然后对其进行二分搜索。)