2010-12-05 19 views
1

Ich mag Frequenz (Monobits) Test in PHP berechnen:Berechnung 0 und 1 ist in PHP

Beschreibung: Der Schwerpunkt des Tests ist der Anteil von Nullen und Einsen für die gesamte Sequenz. Der Zweck von dieser Test ist zu bestimmen, ob die Anzahl der Einsen und Nullen in einer Sequenz sind ungefähr die gleichen wie würde erwartet für eine wirklich zufällige Sequenz. Der Test bewertet die Nähe der Fraktion von Einsen zu ½, dh die Anzahl von Einsen und Nullen in einer Sequenz sollte etwa gleich sein.

Ich wundere mich, dass ich wirklich brauchen, um die und 1'en 0 berechnen die (die Bits) oder ist die folgende ausreichend:

$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; 

Wenn die oben nicht das gleiche ist, dann wie kann ich genau Berechnen Sie die 0 und 1?

Antwort

2

Nein, Sie müssen wirklich alle Nullen und Einsen überprüfen. Nehmen Sie zum Beispiel die folgende Binäreingabe:

01111111 01111101 01111110 01111010 

. Es ist eindeutig (buchstäblich) einseitig (8 Nullen, 24 Einsen, korrektes Ergebnis 24/32 = 3/4 = 0.75) und daher nicht zufällig. Ihr Test würde jedoch 125.0 /255 berechnen, was nahe bei ½ liegt.

Stattdessen wie folgt zählen:

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); 
} 
+0

Das ist, was ich hatte Angst, danke! – Tower

+0

Oh, tut mir leid, habe den zweiten Teil Ihrer Frage nicht gesehen - wie berechnet man eigentlich? Aktualisiert. – phihag