RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1519545
Accepted
David Meyster
David Meyster
Asked:2023-05-14 02:06:07 +0000 UTC2023-05-14 02:06:07 +0000 UTC 2023-05-14 02:06:07 +0000 UTC

制定丢弃对象的算法

  • 772

您需要创建一个用于丢弃对象的算法。

输入数据:

open_cost- 开业成本。

items- 一系列可以掉落的物品。

item['cost']- 项目的成本单独。

您还可以使用:

items_count- 所有项目的数量。

items_cost- 所有项目的成本。

等等。

该算法应该平均给出一个成本等于发现成本的项目。


我需要一个 php 算法。你可以用任何方便的语言来写,对我来说最主要的是理解原理。

我也有自己的算法,但是它的问题是不同的item需要不同的系数,用selection来找。

这是算法:

function getClosest($search, $array)
{
  $num = null;
  foreach ($array as $item) {
    if ($item['chance'] < $search) {
      continue;
    }
    if ($num === null || $item['chance'] < $num['chance']) {
      $num = $item;
    }
  }
  return $num;
}

function getRandomSkin($items, $open_cost, $coeff)
{

  $accum = 0;
  foreach ($items as &$item) {
    if ($open_cost >= $item['cost']) {
      $chance = $item['cost'] / $open_cost * $coeff;
    } else {
      $chance = $open_cost / $item['cost'];
    }

    $item['chance'] = round($chance, 3) * 1000;
    $accum = $skin['chance'] += $accum;
  }

  $rand_num = rand(0, end($items)['chance']);

  $rand_element = getClosest($rand_num, $items);
  return $rand_element;
}

例子:

$items = [
    ['id' => 1, 'cost' => 50],
    ['id' => 2, 'cost' => 100],
    ['id' => 3, 'cost' => 10],
    ['id' => 4, 'cost' => 200],
];

$open_cost = 50;

根据这些数据,掉落物品的几率应该如下:

Формула - $item['cost'] / $open_cost

id_1 - 1
id_2 - 2
id_3 - 5
id_4 - 4

数字越低,掉落的几率就越大。

php
  • 2 2 个回答
  • 57 Views

2 个回答

  • Voted
  1. Borislav
    2023-05-14T19:23:22Z2023-05-14T19:23:22Z

    您可以通过通常的回调排序来实现此行为。

    <?php
    
    $openCost = 50;
    
    $items = [
        ['id' => 1, 'cost' => 50],
        ['id' => 1, 'cost' => 55],
        ['id' => 1, 'cost' => 35],
        ['id' => 1, 'cost' => 40],
        ['id' => 1, 'cost' => 60],
        ['id' => 2, 'cost' => 100],
        ['id' => 3, 'cost' => 10],
        ['id' => 4, 'cost' => 200],
    ];
    
    usort(
        $items,
        static function ($a, $b) use ($openCost) {
            $distA = ($previous - $a['cost']) < 0
                ? $a['cost'] - $openCost
                : $openCost - $a['cost'];
    
            $distB = ($previous - $b['cost']) < 0
                ? $b['cost'] - $openCost
                : $openCost - $b['cost'];
    
            
            return $distA === $distB
                ? 0
                : (
                    $distA < $distB
                        ? -1
                        : 1
                );
        }
    );
    
    foreach($items as $item) {
        var_dump($item['cost']);
    }
    

    回答:

    int(50)
    int(55)
    int(40)
    int(60)
    int(35)
    int(10)
    int(100)
    int(200)
    
    • 0
  2. Best Answer
    Borislav
    2023-05-16T02:44:06Z2023-05-16T02:44:06Z

    游乐场: https://onlinephp.io/c/d9e8b,你可以玩一下看看结果。

    请注意,代码是有效的,但概念上的,如除以 0 和其他东西的细节没有处理,我们会留给你)

    代码:

    <?php
    
    $items = [
        ['id' => 1, 'cost' => 50],
        ['id' => 1, 'cost' => 51],
        ['id' => 1, 'cost' => 53],
        ['id' => 1, 'cost' => 55],
        ['id' => 1, 'cost' => 35],
        ['id' => 1, 'cost' => 37],
        ['id' => 1, 'cost' => 40],
        ['id' => 1, 'cost' => 43],
        ['id' => 1, 'cost' => 60],
        ['id' => 1, 'cost' => 62],
        ['id' => 1, 'cost' => 67],
        ['id' => 2, 'cost' => 100],
        ['id' => 2, 'cost' => 127],
        ['id' => 3, 'cost' => 10],
        ['id' => 4, 'cost' => 200],
    ];
    
    // стоимость открытия ящика
    $openCost       = 50;
    // погрешность стоимости 50 + (50 * 0.2 = 10) = 60 это макс, мин будет на 10 меньше, за границы не уходим
    $factor         = 0.2; // env перменная
    $factorValue    = $openCost * $factor;
    $minItemCost    = $openCost - $factorValue; // 40
    $maxItemCost    = $openCost + $factorValue; // 60
    // коэффициент выпадения элементов стоимостью больше, стоимости открытия
    $coeff          = 0.90; // env переменная, случайность выпадения будет примерно 45% больше стоимости к 55% меньше стоимости
    // эти значения должны сохраняться в базу как счетчик, либо же ходить в нее и аггрегировать данные значения на каждое открытие
    $moreCount      = 5; // это счетчик, либо аггрегированное значение кол-ва выпадений больше стоимости
    $lessCount      = 5; // это счетчик, либо аггрегированное значение кол-ва выпадений меньше стоимости
    // это переменная фарта, т.е. сколько итераций пользователю нужно прокрутиться, чтобы выиграть элемент больше стоимости открытия
    $fart           = 15;
    
    $targetItemsSlice = array_values(
        array_filter(
            $items,
            static function ($item) use ($minItemCost, $maxItemCost, &$moreCount, &$lessCount) {
                return $item['cost'] >= $minItemCost && $item['cost'] <= $maxItemCost;
            }
        )
    );
    
    // чтобы не залипнуть на вечно в цикле, на всякий случай
    $threshold = 1000; // env переменная
    $curFart   = 0; // тот самый счетчик удачи
    for ($i = 0; $i <= $threshold; $i++) {
        $targetItem = $targetItemsSlice[rand(0, count($targetItemsSlice) - 1)];
        
        // var_dump($targetItem);
    
        if ($targetItem['cost'] > $openCost) {
            $moreCount = $moreCount + 1; // либо же пишем в базу и заного аггрегируем, чтобы узнать актуальные данные
        } elseif ($targetItem['cost'] < $openCost) {
            $lessCount = $lessCount + 1; // либо же пишем в базу и заного аггрегируем, чтобы узнать актуальные данные 
        }
        
        // var_dump($moreCount,$lessCount); die;
    
        // тут считаем коэффициент выпадений, больше стоимости открытия к меньше стоимости открытия
        $curCoeff = $moreCount / $lessCount;
    
        // если результат выполнения данного условия true, значит больше стоимости выпадает слишком часто
        if ($curCoeff >= $coeff) {
            if ($curFart >= $fart) {
                // юзер выиграл айтем больше стоимости 
                var_dump(sprintf('Ваш выигрыш%s, поздравляем - ' . $targetItem['cost'], $targetItem['cost'] > $openCost ? ' больше стоимости открытия' : ''));
    
                break;
            }
            
            $curFart++;
            continue;
        }
    
        var_dump('Ваш выигрыш, поздравляем - ' . $targetItem['cost']);
    
        break;
    }
    
    var_dump('The end.');
    
    • 0

相关问题

  • mysqli 类的对象无法转换为字符串

  • 您的系统中缺少 ext-http *,您的系统中缺少 ext-mysql_xdevapi *

  • 如何从csv中删除bom?

  • 当我按下 Enter 键时,如何让 PhpStorm 的 Emmet 插件触发,就像 VS Code 一样?

  • 注释在 Symfony5 中不起作用

  • 搜索最近的地理位置点

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5