2014-10-30 3 views
0

У меня довольно простое приложение, которое необходимо (насколько это возможно) случайно назначить человека команде.Активная запись истина случайная?

На данный момент я повторяю несколько различных методов.

Team.where(assigned: false).order("RANDOM()").first 

, а также загрузки его в массив и используя образец()

arr.sample().inspect 

Однако, они не появляются, чтобы быть действительно случайным образом, они обычно покидают края (1,2 .. 8,9, где count = 10). Есть ли лучший метод, который делает или не связан с AR? Есть ли математически заметная разница между PSQL rand и sqlite3 random()?

Любая помощь по циклам для генерирования случайного распределения оценивается!

+0

Образец всегда был справедливым для меня - вы пытались сделать это несколько сотен тысяч раз и подсчитываете, сколько раз каждый объект будет выбран? –

+1

@williamthomas вы можете использовать смещение, чтобы выбрать случайные значения, проверьте эту ссылку: http://stackoverflow.com/questions/2752231/random-record-in-activerecord – anusha

+0

Да, это «кажется» прекрасно, намного лучше, чем прямо с db , Не уверен, что кэширование оказывает на него какое-либо влияние. – williamthomas

ответ

0

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

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

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