我的rand(0,1)
php函数在我调用它时会随机返回0
和1
。
我可以在php中定义一些内容,以便随机调用30%
个数字0
和70%
数字为1
吗? php有没有内置函数?
答案 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%(或您需要的任何内容)。我认为代码非常容易阅读和理解。
对不起,如果这没有帮助,但我希望是:)。 两种方式都不会造成任何伤害;)。