2013-04-01 52 views
0

在一对夫妇最后一次申请的我本来是要实现概率这是通常一些项目中给出计算概率说:与给定的范围

奖励在一定程度上完成项目的用户X

项目X可能的下面的一个:

jug => probability 25 
glass => probability 50 
plate => probability 20 
dish => probability 5 

我通过创建一个数组并填充所述特定项目的时间的概率是多少解决这一;对于上面的情况,我会有一个数组与25 elements of jug, 50 glasses and so on.。我最后shuffle {PHP}数组,并从中选择一个随机元素。

在另一个应用程序中,这些值总计超过了100,所以我首先从这个总数中计算出他们的尊重百分比,然后使用上面的逻辑。

只是想知道这是从这种结构计算概率的正确方法吗?

我在这里经历了几个关于特种部队的问题,但没有人帮助我解决问题。

如果有更合适的方式来做到这一点,请让我知道

感谢

回答

3

您可以简单地指定以下值:

$jug = 25; 
$glass = 25+50 = 75; 
$plate = 75+20 = 95; 
$dish = 95+5 = 100 

然后获得一个随机的100,并确定它适合,类似于下面的

$jug = 25; 
$glass = 75; 
$plate = 95; 
$dish = 100; 
$items = {"jug", "glass", "plate", "dish"}; 

$rand = random(100); // Get a random number between 0 and 100 

if ($rand < $jug) { 
    return items(0); 
} elseif ($rand < $glass) { 
    return items(1); 
} elseif ($rand < $plate) { 
    return items(2); 
} elseif ($rand < $dish) { 
    return items(3); 
} 

希望这有助于。

0

我会做这一样你,但你不必计算百分比,可以使用更多超过100个元素。

例如,如果A = 80且B = 40,则可以使用包含120个元素的数组。

但是,在数学中有一个术语greatest common divisor,您可以减少元素的数量。在这个例子中,GCD是40,所以A会是2,B会是1,并且您的数组大小会减少到3个元素。例如,当元素的总数量非常大时,这可能很重要。

+0

太棒了!希望我也是一个数学家伙:S,但是,我的数据不会适合这种情况,恐怕它有50,10,5.5,1和0.5的值。在这个GCD中是0.5。我只是看着[this](http://stackoverflow.com/questions/8280514/returning-a-random-value-from-array-with-probability-proportional-to-its-value?rq=1)。我试图理解答案,似乎很安静,但现在无法吸收它。 – Junaid

+0

如果你的值低于1,你需要把它们全部乘以2,所以有1(2 * 0,5)作为GCD,可惜。但在问题的例子中,GCD是5,所以'jug'是5,'glass'是10,'plate'是4,'dish'是1. – Voitcus

+2

我认为@Floin的解决方案更好。 – Voitcus