随机变量的概率

时间:2013-01-10 07:49:19

标签: php math probability

我真的很惭愧地问这个问题,但我没有时间进行修改。也不是母语为英语的人,所以请原谅我缺乏数学词汇。

我正在编写一个程序,需要为变量分配概率,然后随机选择一个。

示例:

想象一下,我有硬币,我想分配大概70%的头部和30%的尾巴。当我扔它时,我希望有70%的机会出现头部和30%的尾巴。

一种愚蠢的方法是创建一个单元格数组,将70个单元格和尾部插入30个。随机化它们并随机选择一个。

编辑1:我还想指出,我不仅限于2个变量。例如,假设我有3个字符可供选择(*,\ $,#),我想为每个字符分配以下内容* = 30%,\ $ = 30%,和#= 40%。< / p>

这就是为什么我不想使用随机函数,并希望看到它是如何以数学方式完成的。

4 个答案:

答案 0 :(得分:2)

你想要另一种方式吗?大多数rand函数从[0,1]产生一个小数。对于30%,检查产生的数量小于0.3

虽然注意,如果你真的测试了感知的“随机性”,它并不是真正的随机......

在PHP中,你可以使用rand(0,99)(整数而不是double,30而不是0.3)。 PHP rand函数是一个封闭的区间(包括两者)

function randWithWeight($chanceToReturnTrue) { // chance in percent
    return rand(0, 99) < $chanceToReturnTrue;
}

编辑:有关感知随机性的说明。一些数学,因为你说你来自数学......从0-99生成数字,将它们添加到数组中。当数组包含重复时停止。它通常需要大约20次传球(我在复赛之前获得3-21次传球,10次传球)。所以这不是你所期望的“随机”。虽然,(我知道我会偏离轨道),看看birthday problem。它比看起来“更随机”。

答案 1 :(得分:1)

如果你想要30%的概率,那就

if(rand(1,100) <= 30){
    // execute code
}

答案 2 :(得分:1)

一种方法是

$r=rand(1,100);
if($r<70)
{
   echo "Head";
}
else
{
   echo "Tail";
}

答案 3 :(得分:1)

这是一个计算加权兰特的简单函数:

<?php
function weightedRand($weights, $weight_sum = 100){
    $r = rand(1,$weight_sum);
    $n = count($weights);
    $i = 0;
    while($r > 0 && $i < $n){
        $r -= $weights[$i];
        $i++;
    }
    return $i - 1;
}

此函数接受数组。例如,array(30,70)获得0的可能性为30%,获得1的可能性为70%。这适用于多个权重。

它的原理是用权重减去生成的随机数,直到它小于或等于零。

Demo with 30%:70%
Demo with 20%:30%:50%