-1

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

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

例子:

想象一下,我有硬币,我想将 70% 的概率分配给正面,30% 分配给反面。当我扔它时,我希望有 70% 的机会出现正面和 30% 的反面。

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

编辑 1:我还想指出,我不限于 2 个变量。例如,假设我有 3 个字符可以在 (*,\$,#) 之间进行选择,我想将以下内容分配给每个字符 * = 30%、\$ = 30% 和 # = 40%。

这就是为什么我不想使用随机函数并想看看它是如何在数学上完成的。

4

4 回答 4

2

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

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

在 PHP 中,您可以使用 rand(0, 99)(整数代替双精度,30 代替 0.3)。PHP rand 函数是一个闭区间(都包含)

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

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

于 2013-01-10T07:51:33.653 回答
1

如果你想要 30% 的概率就做

if(rand(1,100) <= 30){
    // execute code
}
于 2013-01-10T07:53:27.480 回答
1

一种方法是

$r=rand(1,100);
if($r<70)
{
   echo "Head";
}
else
{
   echo "Tail";
}
于 2013-01-10T07:54:26.557 回答
1

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

<?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)将有 30% 的机会获得0和 70% 的机会获得1。这应该适用于多个权重。

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

演示与30%:70%
演示与20%:30%:50%

于 2013-01-10T08:11:33.117 回答