Случайный выбор

922
.

Имеется:
mysql таблица kartinka,в которой есть 10 строк (структура id,image)

и массив
$r=array('',4,0,15,3,1,0,7,25,6,30);
Необходимо случайным образом выбрать одну строку из таблицы,причем шанс быть выбранным согласован с массивом $r (id=1 с $r[1] ,id=2 с $r[2] ...)
Таким образом чаще других должны выпасть картинки 3,8 и 10,а картинки 2 и 6 не выпадут никогда.

.

8 и 10 в массиве $r нет. Так и должно быть? Если да, то какая тогда связь с массивом?

.
Jane
Блиносвёрт ?

dilp, переделай массив, исключи оттуда то, что не должно выпасть, добавь дополнительно элементов, которые должны выпадать чаще, т.е. по теории вероятностей сформируй новый массив, а дальше рэндом

.
aNNiMON

ДоХтор, в массиве указана частота выбора, id картинки совпадает с индексом в массиве.

таблица (+/-)
id | $r
 1 | 4
 2 | 0
 3 | 15
 4 | 3
 5 | 1
 6 | 0
 7 | 7
 8 | 25
 9 | 6
10 | 30


dilp, проблема в том, что частоты указаны в php, а данные лежат в mysql.
Если можно как-то вынести их из массива в таблицу, то задача решается очень просто:
SELECT * FROM kartinka ORDER BY freq * RAND() LIMIT 1

или чуть посложнее:
SELECT * FROM kartinka
WHERE freq > 0
ORDER BY -LOG(1.0 – RAND()) / freq
LIMIT 1
.
Добавлено: 23.04.2017 / 11:10
aNNiMON,
id картинки совпадает с индексом в массиве.
Так я о том и говорю, что в его массиве нет некоторых id картинок.

Добавлено: 23.04.2017 / 11:16
aNNiMON - теперь понял о чём ты говорил.
.
ДоХтор

dilp,

Вариант (+/-)
session_id() ?: session_start();

echo 'Выбрана картинка с id: '. myRand();


function myRand() {
    $id = [1,2,3,4,5,6,7,8,9,10];
    $r = [4,0,15,3,1,0,7,25,6,30];
        
    if (!empty($_SESSION['freak'])) {
        $a = &$_SESSION['freak'];
        $k = array_rand($a);
        
        if ($a[$k] < 1) {
            unset($a[$k]);
            return myRand();
        }
    } else {
        $_SESSION['freak'] = array_combine($id, $r);
        return myRand();
    }

    --$a[$k];
    
    return $k;
}


/* Вариант для массива $id с выпадающими последними элементами */

session_id() ?: session_start();

$id = [1,2,3,4,5,6,7,8,9,10];
$r = [4,0,15,3,1,0,7,25,6,30];

echo 'Выбрана картинка с id: '. myRand($id, $r);

 
function myRand($id, $r) {
    $r = array_slice($r, 0, count($id));
    
    if (empty($_SESSION['freak']) || count($_SESSION['freak']) < 2) {
        $_SESSION['freak'] = array_combine($id, $r);
        return myRand($id, $r);
    } else {
        $a = &$_SESSION['freak'];
        $k = array_rand($a);
 
        if ($a[$k] < 1) {
            unset($a[$k]);
            return myRand($id, $r);
        }
    }
 
    --$a[$k];
    
    return $k;
}
.
Добавлено: 23.04.2017 / 17:57
Jane, Переделка не желательна,так как настройки этого эквалайзера будут менятся.
Р.S еще не тестил

Добавлено: 23.04.2017 / 18:23
У mysql Rand() есть что-то вроде инициализации,что-бы заново повторить ту же выборку?
.
(\/)____o_O____(\/)

dilp, вроде это обычный рандом

.

Как это? Любой рандом должен иметь вводные данные,и от них дальше плясать

.

dilp, в мануале прочитать не?

* (+/-)
RAND()
RAND(N)
Возвращает случайную величину с плавающей точкой в диапазоне от 0 до 1,0. Если целочисленный аргумент N указан, то он используется как начальное значение этой величины:
mysql> SELECT RAND();
-> 0.9233482386203

mysql> SELECT RAND(20);
-> 0.15888261251047

mysql> SELECT RAND(20);
-> 0.15888261251047

mysql> SELECT RAND();
-> 0.63553050033332

mysql> SELECT RAND();
-> 0.70100469486881
В выражениях вида ORDER BY не следует использовать столбец с величинами RAND(), поскольку применение оператора ORDER BY приведет к многократным вычислениям в этом столбце. В версии MySQL 3.23 можно, однако, выполнить следующий оператор: SELECT * FROM table_name ORDER BY RAND(): он полезен для получения случайного экземпляра из множества SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Следует учитывать, что оператор RAND() в выражении WHERE при выполнении выражения WHERE будет вычисляться каждый раз заново. Оператор RAND() не следует воспринимать как полноценный генератор случайных чисел: это просто быстрый способ динамической генерации случайных чисел, переносимых между платформами для одной и той же версии MySQL.
Всего: 38