PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 2
4online Отправлено: 21 Октября, 2015 - 10:33:08 • Тема: Расчет шансов (спорный вопрос) • Форум: Программирование на PHP

Ответов: 26
Просмотров: 2397
1) Меня смутило вот это в ответе
Цитата:
что единичный вызов даст на выходе массив, а не конкретный вариант

не представляю в каком случае вернется массив

2)
Stierus пишет:

- на вход подается массив указанного формата,

У тебя на вход в функцию ничего не передается.


Аргумент передается в конструктор класса.

3)
Stierus пишет:
Что хотели от тебя: Что бы в одной функции, на основании переданной вероятности было принято решение, какой элемент массива вернуть (другими словами, составить функцию, которая бы с помощью генератора случайных чисел и полученных коэффициентов, отдала бы 1 ключ из тех, что получила) Ее можно вызвать 1 раз, 100 или 1000 000 - она работала бы одинаково, у тебя же хранится состояние (количество вызовов), от которого меняется вероятность выпадения того или иного ключа, а этого быть не должно


при описанном тобой подходе, когда не сохраняется состояние, вероятность возврата рандомна. Тоесть по сути а может выпасть не в 20% случаев, а при каждом вызове, особенно если значения очень близки (49% и 51%, например). В моем же случае во всех тестах результат был требуемый в задании, я запустил 1000 раз метод call и мне ключ a вернулся 200, а ключ b 800 раз. Тестировал на разных массивах. При этом значения шли в разброс (a,a,b,a,b,b....), но когда а превышало свой лимит, возвращалось b
4online Отправлено: 21 Октября, 2015 - 08:07:32 • Тема: Расчет шансов (спорный вопрос) • Форум: Программирование на PHP

Ответов: 26
Просмотров: 2397
Приветствую.

Сразу прошу прощения если не в ту ветку вопрос, сделайте скидку на то, что это первое мое сообщение на этом форуме

Находясь в поисках работы решил отправить повторно резюме в одну компанию, куда в феврале уже обращался. В тот раз как и в этот мне прислали тестовое задание из 4 задач. И как и в первый раз так и во второй, мне кажется, что программист, проверяющий решение, меня "прокатил". Что бы разобраться, прошу глянуть на код задание и код.

Задача:
Цитата:
Дан массив:
array (
'a' => 1/3,
'b' => 1/6,
'c' => 1/2
);

Необходимо написать класс или функцию, реализующую следующие требования:
- на вход подается массив указанного формата,
- на выход обязательно возвращается один ключ переданного массива,
- при многократном вызове функции ключи массива должны возвращаться с пропорциями,
указанными в значениях.

Пример:
На вход подается массив a=>1/8, b=>1/2, при запуске функции большое количество раз, в 20%
случаев должен вернуться ключ a, в остальных – b.


Код:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $Array = array(
  3.         'a' => 1/2,
  4.         'b' => 1/8,
  5. );
  6.  
  7. $Chances = new Chances($Array);
  8. $Result = array();
  9. for ($i = 0; $i < 1001; $i++){
  10.         $index = $Chances->call();
  11.         if (!isset($Result[$index])){
  12.                 $Result[$index] = 0;
  13.         }
  14.         $Result[$index]++;
  15. }
  16.  
  17. echo '<pre>';
  18. var_dump($Result);
  19. echo '</pre>';
  20.  
  21. class Chances{
  22.  
  23.         private $__Data;
  24.  
  25.         private $__calls = 0;
  26.  
  27.         public function __construct($Data){
  28.                 if (empty($Data)){
  29.                         throw new Exception('Передан пустой массив');
  30.                 }
  31.  
  32.                 $sum = array_sum($Data);
  33.                 foreach ($Data as $key => $chance){
  34.                         $this->__Data[$key] = array(
  35.                                 'chance' => $chance,
  36.                                 'calls' => 0,
  37.                                 'percent' => $chance/$sum*100,
  38.                         );
  39.                 }
  40.         }
  41.  
  42.         public function call(){
  43.                 $this->__calls++;
  44.                 foreach ($this->__Data as $key => $Data){
  45.                         if ($Data['calls'] < $this->__calls/100*$Data['percent']){
  46.                                 $Result[] = $key;
  47.                         }
  48.                 }
  49.  
  50.                 $index = $Result[rand(0, count($Result)-1)];
  51.                 $this->__Data[$index]['calls']++;
  52.                 return $index;
  53.         }
  54. }
  55. ?>


Ответ проверяющего программиста:
Цитата:
Задание решено неверно. Подход к решению содержит логическую ошибку, приводящую к тому, что единичный вызов даст на выходе массив, а не конкретный вариант. Большая серия вызовов с сохранением результатов в массив скрывает эту ошибку.


Правильное ли замечание он сделал? Я проверял с разными значениями массива, с разным количеством вызовов. Все работало идеально. Где я допустил ошибку?

В прошлый раз было задание по поиску в массиве. И после проверки программист ответил, что надо использовать array_diff, хотя я в комментариях написал, что такой подход работает медленнее, чем мой, на том же Стековерфлоу этот способ рассматривался неоднократно. Вот теперь пытаюсь понять - либо я действительно недопонимаю, либо программист проверяет тестовые задания "на пофиг"

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB