我真的很惭愧地问这个问题,但我没有时间进行修改。也不是母语为英语的人,所以请原谅我缺乏数学词汇。
我正在编写一个程序,需要为变量分配概率,然后随机选择一个。
示例:
想象一下,我有硬币,我想分配大概70%的头部和30%的尾巴。当我扔它时,我希望有70%的机会出现头部和30%的尾巴。
一种愚蠢的方法是创建一个单元格数组,将70个单元格和尾部插入30个。随机化它们并随机选择一个。
编辑1:我还想指出,我不仅限于2个变量。例如,假设我有3个字符可供选择(*,\ $,#),我想为每个字符分配以下内容* = 30%,\ $ = 30%,和#= 40%。< / p>
这就是为什么我不想使用随机函数,并希望看到它是如何以数学方式完成的。
答案 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%。这适用于多个权重。
它的原理是用权重减去生成的随机数,直到它小于或等于零。