PHP假平均评分生成器

7eumitmz  于 2023-02-07  发布在  PHP
关注(0)|答案(1)|浏览(165)

让我们想象一下,这个材料有7票,评分为2.7,我想创建一个脚本,它会生成我想要的评分,看起来真实的而不虚假。
例如,我想让评分从2.7变为4.6,但投票数也要按比例变化,我不知道如何正确实现,我的脚本会让评分6.0如我所愿,但结果投票数将高达500+。我想完善脚本,使它更现实,并以最少的票数更改评级我的代码:
我的脚本将使评分6.0,因为我想要的例子,但投票的数量将高达500+。我想生成的平均值的评分基于以前的值,而在投票的偏差不应该看起来假。

<?php

class RatingFaker
{
    private $totalRating = 10; // Maximum rating threshold (5 or 10)
    private $maxRatingGenerate = 10; // We generate maximum rating values during the passage
    private $minRatingGenerarate = 5; // Minimally generates a rating value during a pass
    private $minRatingCheck = 3.5; // The minimum acceptable threshold from which we start to act
    
    public function __construct($minRatingCheck)
    {
        $this->minRatingCheck = $minRatingCheck;
    }
    
    private function calcAverageRating($ratings = []) 
    {
        $totalWeight = 0;
        $totalReviews = 0;
    
        foreach ($ratings as $weight => $numberofReviews) {
            $WeightMultipliedByNumber = $weight * $numberofReviews;
            $totalWeight += $WeightMultipliedByNumber;
            $totalReviews += $numberofReviews;
            }
    
        //divide the total weight by total number of reviews
        $averageRating = $totalWeight / $totalReviews;
    
        return [
            'rating' => $averageRating,
            'vote_num' => $totalReviews
        ];
    }
    
    private function getRandVoters()
    {
        $randRating = rand($this->minRatingGenerarate, $this->maxRatingGenerate);
        $randVoters = rand(1, 99);
        
        return [
            $randRating => $randVoters
        ];
    }
    
    private function ratingLoop($valueList)
    {
        $valueList = array_merge($valueList, $this->getRandVoters());
        
        $newRating = $this->calcAverageRating($valueList);
        
        if($newRating['rating'] < $this->minRatingCheck) {
            $valueList = array_merge($valueList, $this->getRandVoters());
            
            return $this->ratingLoop($valueList);
        }
        
        if($newRating['rating'] > 10) {
            $newRating['rating'] = 10;
        }
        
        return [
            'rating' => round($newRating['rating'], 1),
            'sum' => round($newRating['vote_num'] * round($newRating['rating'], 1)),
            'voters' => $newRating['vote_num']
        ];
    }
    
    public function check($currentRate, $currentVoteNum)
    {
        if($currentRate < $this->minRatingCheck) {
            $rating = $this->ratingLoop([
                $currentRate => $currentVoteNum,
            ]);
        }
        
        return $rating ?? [];
    }
}

$currentRate = 2.4;
$voteNum = 88;
$oldRating = [
    'rating' => $currentRate,
    'sum' => round($voteNum * $currentRate),
    'voters' => $voteNum
];
$rating = [];

$ratingFaker = new RatingFaker(6.0);
$rating = $ratingFaker->check($currentRate, $voteNum);

echo '<pre>';
echo 'Was:';
print_r($oldRating);
echo "<br>";
echo "<br>";
echo "<br>";
echo 'Now:';
print_r($rating);
echo '</pre>';
dxxyhpgq

dxxyhpgq1#

当前评分为2.5(基于9票)时,如果您希望以最少的票数获得6.0的评分,则需要确保10票的总值为60(60/10 = 6.0)。
电流额定值为:( 2.5*9 / 9 ) = 2.5
加上你的额外投票是:( (2.5*9+x) / 10 ) = 6.0
现在您只需找到x的正确值,即37.5

相关问题