Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.12.25;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм выбора случайного элемента...   Найти похожие ветки 

 
Knight ©   (2011-09-04 01:03) [0]

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


 
Knight ©   (2011-09-04 01:18) [1]

Была идея -
1) брать рэндомайзное число от 1 до 6
2) в соответствии с ним извлекать из перемешанного массива {1,1,1,2,2,3} число, которое будет определять из какой части выборки получать строку
3) Делать выборку с сортировкой нужного поля по возрастанию
4) определять границы нужной части (число записей, делится на 3 части).
5) по граничным строкам генерить число, определяющее нужную строку.

Получается, что из первой части будет чаще, из второ реже, из третей ещё реже.

Но как-то мне это не очень нравиться.


 
Anatoly Podgoretsky ©   (2011-09-04 01:28) [2]

> Knight  (04.09.2011 01:03:00)  [0]

Базы они разные бывают


 
Германн ©   (2011-09-04 01:32) [3]


> Базы они разные бывают

А это вопрос не по базам. А по алгоритмам.
Только не ясный самому автору.


 
Knight ©   (2011-09-04 01:35) [4]


> Только не ясный самому автору.

Точно, нужен пинок в нужном направлении :)


 
Anatoly Podgoretsky ©   (2011-09-04 01:43) [5]

> Германн  (04.09.2011 01:32:03)  [3]

Random и запрос с нужным номером.


 
Knight ©   (2011-09-04 01:46) [6]


> Anatoly Podgoretsky ©   (04.09.11 01:43) [5]

Тогда все строки равноправны, что мне не надо.


 
MBo ©   (2011-09-04 08:56) [7]

Пусть дан массив A[] из N положительных чисел.

Насчитаем массив B[k] = Sum[i = 1..k] (1 / A[i])

Теперь на каждый запрос получаем случайное число R = Random*B[N], бинарным поиском находим индекс B, куда попадает R

P.S. Для широкого диапазона чисел функция 1/A может давать слишком резкое распределение.


 
Anatoly Podgoretsky ©   (2011-09-04 09:17) [8]

> Knight  (04.09.2011 01:46:06)  [6]

Используй Оракл


 
Sha ©   (2011-09-04 09:45) [9]

> Требуется алгоритм выбора случайной строки из базы данных в зависимости от значения некого поля.

Он такой не один. Какой из них нужен?


 
Knight ©   (2011-09-05 11:59) [10]


> Он такой не один. Какой из них нужен?

Который оптимальнее для баз. А вообще, все бы посмотрел.


 
Sha ©   (2011-09-05 12:18) [11]

> А вообще, все бы посмотрел.

Все подходящие алгоритмы посмотреть невозможно, т.к. их множество неперечислимо.
Какой из них показать?


 
Dimka Maslov ©   (2011-09-05 12:20) [12]

Устанавливаем в зависимости от поля пороговое значение 0 - 100% вероятности 1 - 0% вероятности. Генерируем случайное число в диапазоне от 0 до 1. Если полученное число больше порогового - производим нужное нам действие.


 
Knight ©   (2011-09-05 12:37) [13]


> Какой из них показать?

Простой. И чтобы поменьше нагрузка на сервер.

Повторю ещё задачу.
1) Есть таблица базы
2) количество строк примем равным паре сотен тысяч
3) в таблице есть поле - Field1 в котором число от 0 до 500.
4) требуется выдавать "случайную" строку из базы так, чтобы частота её появления была обатно пропорциональна значению поля Field1, т.е. чем больше значение, тем реже она выбирается.


 
Sha ©   (2011-09-05 12:42) [14]

> Knight ©   (05.09.11 12:37) [13]

[7] читал?

> число от 0 до 500
> обатно пропорциональна

1/0 = ?


 
Медвежонок Пятачок ©   (2011-09-05 12:44) [15]

на клиенте сгенерить параметр, удовлетоворяющий "обратной пропорциональности" (0-500)

сделать селект по field1 = параметр.
добаваить во where второй уровень случайности (синтаксис от сервера зависит)


 
Sha ©   (2011-09-05 12:53) [16]

Задача странная какая-то.
Подозреваю, что в таблице не больше 1000 записей.


 
Очень злой   (2011-09-05 23:53) [17]


> > Какой из них показать?
>
> Простой. И чтобы поменьше нагрузка на сервер.
>
> Повторю ещё задачу.
> 1) Есть таблица базы
> 2) количество строк примем равным паре сотен тысяч
> 3) в таблице есть поле - Field1 в котором число от 0 до
> 500.
> 4) требуется выдавать "случайную" строку из базы так, чтобы
> частота её появления была обатно пропорциональна значению
> поля Field1, т.е. чем больше значение, тем реже она выбирается.
>
>


Частота выбора определяется точным значением поля? Или достаточно того, что чем больше значение поля - тем частота ниже?

Просто в последнем случае достаточно вычислить рандом(рандом(кол-во записей)), а потом взять эту по счету запись из отсортированной по требуемому полю таблице...


 
CRLF   (2011-09-06 11:32) [18]


> В такой зависимости, что чем больше в этом поле число, тем
> реже выбирается данная строка.

Экспоненциальное распределение курите


 
OW ©   (2011-09-06 13:02) [19]

выбрать случайное из выборки

select * from T
where 1/T.Field > Random [0,1]


 
OW ©   (2011-09-06 13:22) [20]

погонял под mssql, на больших кол-вах испытаний примерно похоже.

select
Cast( ROW_NUMBER()OVER(order by IdMainShot) as INT) as NUM,
*
from mainshot MS
       where 1/SALDO > RAND()

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



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.12.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1315479852
dEN
2011-09-08 15:04
2011.12.25
Удалить определенные символы в строке


15-1314966325
oldman
2011-09-02 16:25
2011.12.25
Может кому и пригодится...


3-1269069120
Alexsis f
2010-03-20 10:12
2011.12.25
Хранение табличной части документа


3-1269033816
Slym
2010-03-20 00:23
2011.12.25
проблема с датами и временем в ADOComand


2-1315654752
TheEd
2011-09-10 15:39
2011.12.25
Первая видимая запись в TDBStringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский