4

スウェーデンで最も人気のあるWebサイトの1つで作業しているときに、すべてのページで実行される(私にとって)奇妙なスニペットに出くわしました。

if( rand(0, 100) === 50 )
   // increase visitor count

これにより、乱数が生成され、固定数(この場合は50)に等しい場合は、訪問者数が増加します。統計を表示するページでは、訪問者数にたとえば100を掛けてから表示します。

特にこのような非常に大規模なWebサイトの場合、ページビューごとにデータベースに書き込むのは理想的ではない可能性があることを私は理解しています。しかし、これは本当に正しい統計を生成しますか?99人の訪問者の乱数がすべてに等しいからといって、100は、次の訪問者が100を取得することを意味するわけではありません。

私は過剰反応していますか、それともこれは悪い統計の実装ですか?

4

2 に答える 2

1

わかりました、私はそれを持っていると思います。要するに、この方法は、 「スウェーデンで最も人気のあるWebサイトの1つ」から理解できるように、十分に正確で優れた方法である可能性があります。説明させてください:

3つの要因があります:

  1. 実際の訪問数-実際のページビュー数
  2. 追跡された訪問-追跡された訪問、乱数チェックに合格した訪問
  3. 計算された訪問-統計ページに表示される訪問

そして、私はそれをコードに翻訳することができます:

任意のページで見られるように:

//are you here? you are an ACTUAL visit
if(rand(0, 100) === 50){
    //are you here? you are a TRACKED visit
    //passing info to the database as current number+1
}

および統計ページ:

//variable $tracked is number of tracked visits from the page

//this is a CALCULATED visit
echo 'Page visits: '.$tracked*100;

また、実際の訪問も追跡訪問になる可能性が1%あると言えます。しかし、今、次の質問があります。なぜ、訪問の1%だけを追跡する必要があるのでしょうか。すべての訪問を追跡することはできませんか?

  • すべてのページが1000ビュー/分を取得する場合、この方法は優れたパフォーマンスブースターであり、かなり良い結果をもたらす可能性があります(実際の訪問に十分近い)。

  • すべてのページが100ビュー/分になる場合、この方法でもパフォーマンスが向上し、かなり正確な結果が得られる可能性があります。

パフォーマンスについて言えば、1分あたり1000のデータベースクエリを想像してみてください。個人的にはそうするのは良いことではないと思います。したがって、クエリの量を減らすために、データベースへの呼び出しの数を実際に制限するには、データベースの入り口に「ガード」を配置し、ランダムな質問をして、人の数のバランスを取ります。中身。

もちろん、パフォーマンスと精度の完璧なバランスを見つける必要があります。自分でシミュレートできます。

  1. $actual最終結果の正確さを見つけるのに役立ちます
  2. $hitsヒット数が表示されます(ガードを通過した人)
  3. $hit_chance渡される結果の数を制限します。パフォーマンスは高くなりますが、精度は低くなります。見て!100に設定すると、チャンスは%1(1/100)になり、10000に設定すると、チャンスは1/10000になり、10 1/10(10%)に設定すると、などになります。
  4. $final計算された訪問数が表示されます。

$actual = 7000; //set the number of visits you want to check (check the current site statistics!)
$hits = 0; //initialization of variable
$hit_chance = 100; //set hit chance, currently 1%
$answer = intval(round($hit_chance / 2, PHP_ROUND_HALF_UP)); //just set answer between 0 and $hit_chance, which is an integer

    for($i=0;$i<$actual;$i++){
        if(rand(0, $hit_chance) === $answer){
            $hits++;
        }
    }

$final = $hits * $hit_chance;
$accuracy = 100 - ((($actual - $final) / $actual) * 100);

echo 'Actual visits: '.$actual;
echo '<br>Hits: '.$hits;
echo '<br>Final results: '.$final;
echo '<br>Result accuracy: '.$accuracy.'%';

もう一度考えてみると、それはあなた次第です-良い/悪い方法はないと思います。たぶん、サーバーはとても良いので、それを必要としないでしょうし、たぶん、サーバーはパフォーマンスをいくらか節約する必要があります。

于 2012-11-13T16:19:36.413 に答える
0

レコードが多いほど、正確になります。ヒット数が約1.000.000を超えると、長期的には計算が均等になるため、統計が非常に正確であると言っても過言ではありません。

短期的には、それは私の意見ではかなりひどいです。

于 2012-11-12T15:46:44.887 に答える