我想用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?
答案 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);
}