В отсортированном массиве, как перемешать каждые 3 элемента случайным образом, но сохранить общую сортировку? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть отсортированный массив (по значению) с числами от 900000 до 000000, в то время как первая цифра описывает общий номер позиционирования, за которым следуют все остальные цифры.

Значение получает число на основе предыдущих вычислений для формирования оценки фильтра. Чем лучше оценка, тем выше будет рейтинг у предмета с таким счетом.

903402.55
^ ^  ^
| |  |_ Describes individual score in sorting -> higher -> better
| |__ describes general score value in sorting -> higher -> better
|__ describes general category that forms sorting roughly 

Теперь у меня есть массив, полный таких оценок, отсортированных по результату DESC (от HIGH до LOW).

1010 * Т.е. *

[
'item_id_1' => 903402.55,
'item_id_2' => 903402.55,
'item_id_3' => 903402.52,
'item_id_4' => 903402.51,
'item_id_5' => 903402.40,
'item_id_6' => 903402.39,
'item_id_7' => 903402.37,
'item_id_8' => 903402.37,
'item_id_9' => 903402.21,
'item_id_10' => 903402.10,
'item_id_11' => 903402.08,
'item_id_12' => 903402.01,
]

и так далее.

Теперь я хочу перетасовать каждый 3-й элемент, но поддерживать общий порядок, чтобы четвертый элемент не мог стать вторым элементом всего массива, но в позиции 1-3, соответственно, масштабируемой при обработке всего массива.

Это означает, что мой потенциальный результат будет таким:

[
'item_id_3' => "now better then 1",
'item_id_1' => "now worse then 3 but better then 2",
'item_id_2' => "now worse then 1 but better then 5",
'item_id_5' => "now better then 4, can't change 3-group",
'item_id_4' => "now worse then 5",
'item_id_6' => "now worse then 4",
...
]

Что я сделал, так это сгруппировал весь массив по 3, чтобы я получил массив, содержащий каждые 3 элемента в правильном порядке.

$i = 0;
        $shuffleGroup = [];
        foreach ($scores as $productId => $score) {
            $shuffleGroup[$i][$productId] = $score;
            if(count($shuffleGroup[$i]) === 3){
                $i++;
            }
        }

Теперь я хотел бы создать правильную манипуляцию с партитурой, чтобы сохранить общий порядок, но рандомизировать ее на 3 части.

Как бы я это сделал?

1 Ответ

0 голосов
/ 18 мая 2019

Из того, что я понимаю, этот код сначала разбивает оценки на куски по 3.

Затем, чтобы потенциально изменить порядок, сначала он выбирает наивысший и самый низкий баллы в этой группе, а затем назначает новое случайное число (между минимальным и максимальным значениями, округленными до 2 десятичных знаков) для каждого из 3 элементов в группе (случайное число, сгенерированное с использованием алгоритма из примеров в руководстве ).

Затем повторная сборкавесь массив и использует arsort() для сортировки результата по случайным оценкам ...

$groups = array_chunk($scores, 3, true);
foreach($groups AS &$group) {
    $min = min($group);
    $max = max($group);
    foreach ( $group as &$score )    {
        $score = round($min + mt_rand() / mt_getrandmax() * ($max - $min),2);
    }
}
$newScores = array_merge(...$groups);
arsort($newScores);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...