定义随机数的百分比

时间:2013-12-26 19:26:46

标签: php

我的rand(0,1) php函数在我调用它时会随机返回01

我可以在php中定义一些内容,以便随机调用30%个数字070%数字为1吗? php有没有内置函数?

5 个答案:

答案 0 :(得分:12)

不确定

 $rand = (float)rand()/(float)getrandmax();
 if ($rand < 0.3)
    $result = 0;
 else
    $result = 1;

你也可以处理任意结果和权重。

 $weights = array(0 => 0.3, 1 => 0.2, 2 => 0.5);
 $rand = (float)rand()/(float)getrandmax();
 foreach ($weights as $value => $weight) {
    if ($rand < $weight) {
       $result = $value;
       break;
    }
    $rand -= $weight;
  }

答案 1 :(得分:4)

您可以这样做:

$rand = (rand(0,9) > 6 ? 1 : 0)

rand(0,9)将生成0到9之间的随机数,并且每当随机生成的数字大于6(应该接近70%的时间)时,它将为您提供1 0 1}} ...

显然,对我来说这似乎是最简单的解决方案,但是肯定的是,它不会给你1正好70%的次数,但是如果做得不对,应该非常接近。

但是,我怀疑任何基于rand的解决方案都会给你1正好70%...

答案 2 :(得分:1)

创建一个70%1和30%0的数组。然后随机排序。然后开始从数组的开头到结尾选择数字:)

$num_array = array();
for($i = 0; $i < 3; $i++) $num_array[$i] = 0;
for($i = 0; $i < 7; $i++) $num_array[$i] = 1;
shuffle($num_array);

<强>优点:  对于任何这样的阵列,你将得到正好30%0和70%1。

缺点:可能需要比仅rand()解决方案更长的计算时间来创建初始数组。

答案 3 :(得分:1)

生成介于1和100之间的新随机值。如果该值低于30,则使用0,否则使用1

$probability = rand(1, 100);
if ($probability < 30) {
    echo 0;
} else {
    echo 1;
}

要测试此理论,请考虑以下循环:

$arr = array();
for ($i=0; $i < 10000; $i++) { 
    $rand = rand(0, 1);
    $probability = rand(1, 100);
    if ($probability < 30) {
        $arr[] = 0;
    } else {
        $arr[] = 1;
    }
}

$c = array_count_values($arr);

echo "0 = " . $c['0'] / 10000 * 100;
echo "1 = " . $c['1'] / 10000 * 100;

输出:

0 = 29.33
1 = 70.67

答案 4 :(得分:0)

我搜索了问题的答案,这就是我找到的主题。 但是它没有回答我的问题,所以我必须自己弄清楚,然后我做到了:)。

我发现也许这也会对其他人有帮助。 它与您的要求有关,但是更多用法。

基本上,我将它用作随机生成的物品(例如武器)的“力量”计算器。该项目在数据库中具有“最小功率”和“最大功率”值。我希望有80%的机会使“功率”值更接近商品的最大可能功率的较低80%,而使20%的可能性达到最大最大20%的最大功率(存储在数据库中)。

为此,我执行了以下操作:

$min = 1; // this value is normally taken from the db
$max = 30; // this value is normally taken from the db

$total_possibilities = ($max - $min) + 1;

$rand = random_int(1, 100);

if ($rand <= 80) {    // 80% chances
    $new_max = $max - ($total_possibilities * 0.20); // remove 20% from the max value, so you can get a number only from the lowest 80%
    $new_rand = random_int($min, $new_max);
} elseif ($rand <= 100) {    // 20% chances
    $new_min = $min + ($total_possibilities * 0.80); // add 80% for the min value, so you can get a number only from the highest 20%
    $new_rand = random_int($new_min, $max);
}

echo $new_rand; // this will be the final item power

唯一的问题是,初始$min$max变量是否相同(或者显然,如果$max大于$min) 。这将引发错误,因为随机变量的工作方式为($min, $max),而不是相反。

可以很容易地将此​​代码更改为具有不同用途的更多百分比,而不是将80%和20%放入40%,40%和20%(或您需要的任何内容)。我认为代码非常容易阅读和理解。

对不起,如果这没有帮助,但我希望是:)。 两种方式都不会造成任何伤害;)。