0

我的数据库存储有关用户、他们的组和关系的信息。users 表中的一列 ,fcount跟踪每个用户在其当前组中的关系数;它从 0 开始,我会在适当的时候增加它。
我需要编写一个脚本来选择给定组中的所有用户,然后随机选择其中一个用户,被选中的概率取决于一个人拥有的关系数量;更少的关系意味着更大的可能性。

目前,我使用以下代码完成此操作,减去概率部分:

$query = "SELECT uid FROM users WHERE groupid=:gid AND status='1'";
...
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    $friends[] = $row[0];
}

foreach ($users as $value) {
    $key = array_search($value, $friends);
    unset($friends[$key]);
    shuffle($friends);
    $newrel = end($friends);
    $user = $value;
    $friends[] = $value;

    $query = "UPDATE users SET rel=:newrel WHERE uid=:uid";
    $query_params = array(':newrel' => $newrel, ':uid' => $user );
... }

我认为调整概率的最简单方法是编辑$friends数组,以便用户多次出现。因此,具有fcount0 的用户将在数组中重复 5 次,具有fcount1 的用户将重复 3 次。[也许这不是处理它的最佳方式,但它对我来说很有意义并且符合我已有的代码。您可以自由提供更好的方案。]

我还没有弄清楚如何获取用户数组并将应该相乘的用户的条目相乘。

SELECT uid, fcount FROM users WHERE groupid=:gid AND status='1';

返回反映此表的数组:

+-----+--------+
| uid | fcount |
+-----+--------+
| 105 |      3 |
| 106 |      2 |
| 107 |      0 |
| 108 |      0 |
| 109 |      1 |
+-----+--------+

然后变成这样的数组:

array(15) { 
[0]=> string(3) "105" 
[1]=> string(3) "106" 
[2]=> string(3) "107" 
[3]=> string(3) "107" 
[4]=> string(3) "107" 
[5]=> string(3) "107" 
[6]=> string(3) "107" 
[7]=> string(3) "108" 
[8]=> string(3) "108" 
[9]=> string(3) "108" 
[10]=> string(3) "108" 
[11]=> string(3) "108"
[12]=> string(3) "109" 
[13]=> string(3) "109" 
[14]=> string(3) "109" 
}  

在我看来,这可以通过根据循环中的 if 语句foreach将每个用户 ID n次推送到新数组中来完成。我会尝试构建它,即使我可能会失败。

4

2 回答 2

1
$problist = array();
foreach ($row as $value) {
    if ($value['fcount'] == 0) {
        array_push($problist, $value['uid'], $value['uid'], $value['uid'], $value['uid'], $value['uid']);
    } elseif ($value['fcount'] == 1) {
        array_push($problist, $value['uid'], $value['uid'], $value['uid']);
    } elseif ($value['fcount'] >= 2) {
        $problist[] = $value['uid'];
    }
}
于 2013-04-19T13:45:04.387 回答
0

在一般情况下计算概率的最简单方法

$relations = 10;
$chance = rand(1,100);
if ($chance <= $relations) {
// success
}

在这种情况下,关系越多,概率就越大,就像如果 $relations = 99,你将有 99% 的概率点击这个用户,关系 = 99

于 2013-04-18T11:49:31.113 回答