2012-04-09 3 views
1

Я в настоящее время работает на Android приложения, и я пытаюсь получить случайное значение из таблицы базы данных, которая выглядит следующим образом:Получение случайного значения из таблицы SQLite

| ID | Score| 
| 1 | 20 | 
| 2 | 5 | 
| 5 | 5 | 
| 6 | 5 | 
| 14 | 15 | 

(предположим, это единственный значения в таблице)

Хотелось бы получить случайную величину из этой таблицы, которая имеет идентификатор 1 40% времени, ID 2 10% времени, ID 5 10% времени и т. д.
Если это возможно, как бы вы это сделали?

+0

Почему бы не использовать хеш-таблицу вместо SQLite? Нужно ли сохранять данные? – Aidanc

+1

Кроме того, если это единственные значения в базе данных .. и ID 1 = 40%, {2,5,6,14} = 10% каждый .. что происходит в других 20% случаев? Этот вопрос нуждается в дальнейшем объяснении. – Aidanc

+0

@Aidanc: Я думаю, что показатель на самом деле является «относительным» счетчиком, поэтому все они суммируются до 100. Таким образом, 14 на самом деле 30%, так как значение равно 15. Но я только угадываю здесь ... – Patrick

ответ

1

Приведено List<Integer>, add() указатель каждой песни score раз, Collections.shuffle() список и играть в порядке. Для получения лучших результатов пропустите последовательные дубликаты. Подробнее here.

0

Существует нет встроенной поддержки от любой из известных баз данных для случайного выбора. Если вы делаете какие-то поиски вы могли бы найти что-то вроде:

select * from my_table order by rand(); 

Но это крайне неэффективно, как он пытается сортировать всю таблицу.

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

Теперь новый выбор, то есть более сложный.

Более простой вариант будет работать что-то вроде этого:

  1. Получить список всех идентификаторов (id) и весам (weight) в таблице
  2. итерацию по списку и рассчитать совокупный. вес cwieght для каждого идентификатора.
  3. Когда вы дойдете до конца списка вы будете иметь в общей сложности всех весов. Выберите случайное число r от 0 до этой суммы.
  4. Sca n через список снова и найдите элемент, где r >= cweight && r < cweight+weight Вы можете использовать поиск бинарной отбивной для этого, если вы игра.

othersmarter approaches к этому также, которые зависят от определенных ограничений.

Смежные вопросы