Имеется:
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 нет. Так и должно быть? Если да, то какая тогда связь с массивом?
dilp, переделай массив, исключи оттуда то, что не должно выпасть, добавь дополнительно элементов, которые должны выпадать чаще, т.е. по теории вероятностей сформируй новый массив, а дальше рэндом
ДоХтор, в массиве указана частота выбора, 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 - теперь понял о чём ты говорил.
Добавлено: 23.04.2017 / 17:57
Jane, Переделка не желательна,так как настройки этого эквалайзера будут менятся.
Р.S еще не тестил
Добавлено: 23.04.2017 / 18:23
У mysql Rand() есть что-то вроде инициализации,что-бы заново повторить ту же выборку?
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.