在PHP中计算0和1

时间:2010-12-05 16:30:06

标签: php

我想用PHP计算频率(单比特)测试:

  

描述:测试的重点是   零和一的比例   整个序列。的目的   这个测试是判断是否   序列中的1和0的数量   与将会大致相同   期望真正随机的序列。   测试评估了接近程度   ½的一部分,即½   a中的1和0的数量   序列应该大致相同。

我想知道我是否真的需要计算0和1(位)或以下是否足够:

$value = 0;

// Loop through all the bytes and sum them up.
for ($a = 0, $length = strlen((binary) $data); $a < $length; $a++)
    $value += ord($data[$a]);

// The average should be 127.5.
return (float) $value/$length;

如果上述不一样,那我该如何准确计算0和1?

1 个答案:

答案 0 :(得分:2)

不,你真的需要检查所有零和一。例如,采用以下二进制输入:

01111111 01111101 01111110 01111010

。它显然(字面上)是单侧的(8个零,24个,正确的结果24/32 = 3/4 = 0.75),因此不是随机的。但是,您的测试会计算125.0 /255,接近½。

相反,计算如下:

function one_proportion($binary) {
    $oneCount = 0;
    $len = strlen($binary);
    for ($i = 0;$i < $len;$i++) {
        $intv = ord($binary{$i});
        for ($bitp = 0;$bitp < 7;$bitp++) {
            $oneCount += ($intv>>$bitp) & 0x1;
        }
    }
    return $oneCount / (8 * $len);
}