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
Facemash algorithm
提问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
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# 类是
I used it on my
我用在我的
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 Mike
I've recreated it as well, but in a WordPress plugin
我也重新创建了它,但是在 WordPress 插件中
http://codecanyon.net/item/pics-mash-image-rating-tool/3256459?ref=mikemayhem3030
http://codecanyon.net/item/pics-mash-image-rating-tool/3256459?ref=mikemayhem3030
回答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