php Facemash 算法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3848004/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 11:18:39  来源:igfitidea点击:

Facemash algorithm

phpalgorithmfacebook

提问by ma11hew28

Does anyone know the facemash algorithm that Mark Zuckerberg implemented in his facemash site? http://www.thecrimson.com/article/2003/11/19/facemash-creator-survives-ad-board-the/

有谁知道马克扎克伯格在他的 facemash 网站上实现的 facemash 算法? http://www.thecrimson.com/article/2003/11/19/facemash-creator-survives-ad-board-the/

Preferably in PHP & MySQL.

最好使用 PHP 和 MySQL。

采纳答案by Reid Barton

I don't know what algorithm was actually used for the real-world site, but what they write on the window in the movie is based on the Elo rating system, which originated in the chess world and is now also used in many other games.

我不知道真实世界的网站实际使用了什么算法,但他们在电影中的窗口上写的是基于Elo评级系统,该系统起源于国际象棋世界,现在也用于许多其他游戏.

回答by ikwillem

enter image description here

在此处输入图片说明

UPDATE:

更新:

As I said in the comments, I've added this algerithm to my new website. At first it seemed to work perfectly. But after some weird inputs some strange result began to form.

正如我在评论中所说,我已将此算法添加到我的新网站。起初它似乎工作得很好。但是在一些奇怪的输入之后,一些奇怪的结果开始形成。

While debugging I figured out what I was doing wrong. When getting the score for a "direct relationship" (used in the indirect relationship too) between 2 nodes I added the scores together. This was wrong, the score of a direct relationship should be expressed in -1 to +1, where:

在调试时,我发现我做错了什么。在获得 2 个节点之间的“直接关系”(也用于间接关系)的分数时,我将分数加在一起。这是错误的,直接关系的分数应该用-1到+1表示,其中:

-1 = lost everything 
+1 = won everything

So if A won 8 times to B, and B won 2 times to A the score should be:

因此,如果 A 赢了 B 8 次,B 赢了 A 2 次,则分数应该是:

(A wins) 8 + (B wins) 2 = (total matches)10
(delta of -1 and +1 =) 2 / (total matches)10 = (points per win) 0.2
Score of A vs B = (points per win) 0.2 * (wins) 8 - 1 = 0.6
Score of B vs A = (points per win) 0.2 * (wins) 2 - 1 = -0.4

Also I didn't mention this in the original explanation but it is all about triangles. So when we look at the indirect score, you don't need to go any further than 1 hop.

此外,我在最初的解释中没有提到这一点,但都是关于三角形的。因此,当我们查看间接得分时,您只需跳一跳即可。

回答by Luke

I recreated it aswell check it out. Not sure about php but the C# class is

我重新创建了它并检查它。不确定 php,但 C# 类是

http://lukedurrant.com/2010/11/c-elo-rating-class-used-on-facemash-as-seen-in-the-social-network-movie/

http://lukedurrant.com/2010/11/c-elo-rating-class-used-on-facemash-as-seen-in-the-social-network-movie/

I used it on my

我用在我的

Facemash

面糊

Key press code is

按键代码是

$(document).keydown(function(event) {
    if (event.keyCode == 37) {
        //Voted Face 1
        Rate("face1", false);
    } 
    if(event.keyCode == 39) {
        //Voted Face 2
        Rate("face2", false);
    }

});

回答by Nour Wolf

    <?php
    //This page is responsible to return a JSON object
    //code starts after the functions for those who might get confused xD

    header('content-type: application/json; charset=utf-8');


    global $responseData;


    function AdjustRate($Ra, $Ea, $Sa)
    {
        //i used my own rules here 32 points for less than 500
        if($Ra < 500)
            $k = 32;
        elseif ($Ra < 1000)//24 points for anything between 500 and 1000
            $k = 24;
        else
            $k = 16;//16 for anything more than 1000

        return $Ra + ($k*($Sa - $Ea));
    }

    function GetExpectedChance($rA, $rB) // the ELO formula taken from http://en.wikipedia.org/wiki/Elo_rating_system
    {
        return (1/(1+pow(10,(($rB-$rA)/400))));
    }

    function setNewRates($lastCall) // function I used to update my database tables
    {
        global $responseData;

        $A = $lastCall->p1;
        $B = $lastCall->p2;
        $C = $lastCall->c;
        $A->E = GetExpectedChance($A->rate, $B->rate);
        $B->E = GetExpectedChance($B->rate, $A->rate);

        // decide who won and who lost
        if($A->id == $C){
            $winner = $A;
            $looser = $B;
        }
        elseif ($B->id == $C) {
            $winner = $B;
            $looser = $A;
        }

        // 3 cases, in all of them winner will get his rate/hits increased by 1
        //Case #1: normal case we just update rate/hits for the winner, this applies all the time
        $winner->rate += 1;
        $winner->hits += 1;
        //Case #2 / #3 : here we should adjust the rate after applying case #1
        // if he won while he is expected to lose OR if he lost while expected to win
        // there should be minimum rate different of 40 between the two
        $diff = abs($winner->rate - $looser->rate);
        if($diff >= 40 && ($winner->E < 0.5 || $looser->E >= 0.5)) {
            $winner->rate = AdjustRate($winner->rate, $winner->E, 1);
            $looser->rate = AdjustRate($looser->rate, $looser->E, 0);
        }


        // update the db to update rates, hits for both winner and looser
            $updateQuery = 'UPDATE user SET rate='.$winner->rate.',hits='.$winner->hits.' WHERE id=' . $winner->id;
            mysql_query($updateQuery);

            $updateQuery = 'UPDATE user SET rate='.$looser->rate.' WHERE id=' . $looser->id;
            mysql_query($updateQuery);

        // Save to responsedate
        $responseData->winner = $winner;
        $responseData->looser = $looser;
    }

    //CODE STARTS HERE :)

    // Setup the mysql connection
    include 'db.php';
    // Part 1: calculate the rate and save to db, if we have a lastcall
    // GET the last call data object, it has p1, p2, c, these are the items i recieved from my javascript ajax call
    $lastCall  = json_decode((string)$_GET['lastCall']); // it was a JSON object so i need to decode it first
    // Save last call data, will be sent with the respond as well
    $responseData->lastCall = $lastCall;

    // if there is a json object, means that there was a rating process and I have to set the new rates
    if($lastCall->c != NULL)
    {
        setNewRates($responseData->lastCall);
    }

    // Part 3: Select new persons and addthem to our responseData
    $q = Array();
    $q[0] = 'SELECT id, name, sex, rate, hits FROM user WHERE fm_status=1 AND sex="female" ORDER BY RAND() LIMIT 2';
    $q[1] = 'SELECT id, name, sex, rate, hits FROM user WHERE fm_status=1 AND sex="male" ORDER BY RAND() LIMIT 2';

    // girls or boys ?
    srand(mktime());
    $query = $q[array_rand($q)];
    $result1 = QueryIntoArray($query);
    $responseData->user = $result1;


    // Part 4: encode to JSON/JSONP string then respond to the call
    $json = json_encode($responseData);
    $json = isset($_GET['callback'])? "{$_GET['callback']}($json)" : $json;
    echo $json;

    mysql_close();
    // by Noor Syron :)
    //I used this in my www.mimm.me

    ?>

回答by Pratik Chowdhury

`I have designed the code in Perl all from google searching and it works.

`我已经通过谷歌搜索在 Perl 中设计了代码并且它可以工作。

Here's It

这是它

use strict;
use warnings;
use WWW::Mechanize;
use LWP::Simple;

sub images()
{
my $mech = WWW::Mechanize->new();
my ($site,$count,$file,$dir);
print "\t\t\tDesigned By NUMWARZ GAMING\n\n";
print "Enter the name of the site you want to search for images\t:\n";
$site = <STDIN>;

    print "Enter the folder where you want to save this\t:\n";

    $dir = <STDIN>;

    open my $doc, ">" , $dir."sitelist.txt";

    $mech->get( $site);

    my @links = $mech->images();

    $count = 0;

    for my $link ( @links ) 
    {
    $file = $dir.$count.".jpg";

    mirror($link->url,$file);

    print $file," : "$link->url,"\n";

    print $doc $link->url." ".$file."\n";

    $count+=1;
  }
  close $doc;
  exit;
  }

 images();

回答by Henrik P. Hessel

No not here not anywhere on the web. The Facemash source code has never been released to the public. The only one, who might still have a copy is Mark Zuckerberghimself.

不,不在这里,不在网络上的任何地方。Facemash 源代码从未向公众发布过。唯一可能还有副本的人是马克·扎克伯格本人。

回答by abhijeet

here is a clone of facemash available http://www.facemash.99k.org

这里有一个 facemash 的克隆版http://www.facemash.99k.org