Вы можете выбрать все записи из основной таблицы, для которой Loc_id не существует в таблице местоположений с условием NOT EXISTS и коррелированным подзапросом:
SELECT m.*
FROM master m
WHERE NOT EXISTS (
SELECT 1 FROM locations l WHERE l.Loc_id = m.UserLocation
)
Взгляните на Boost.Random , особенно boost :: uniform_int <>
.
Как вы говорите, просто генерируйте случайные целые числа.
Тогда у вас есть 32 случайных бита с равновероятными единицами и нулями.
Получите биты в цикле:
for (int i = 0; i < 32; i++)
{
randomBit = (randomNum >> i) & 1
...
// Do your thing
}
Повторите это столько раз, сколько вам нужно, чтобы получить правильное количество битов.
преобразовать случайное число в двоичное
Почему бы не получить только одно число (подходящего размера, чтобы получить достаточно битов), а затем преобразовать его в двоичное. На самом деле вы получите биты из случайного числа, что означает, что они также являются случайными.
Нулевые и единицы также имеют вероятность 50%, поскольку взятие всех чисел от 0 до некоторого ограничения 2 ^ n и подсчет количества нулей и единицы равны>, что означает, что вероятность наличия нулей и единиц одинакова.
относительно скорости
это, вероятно, будет очень быстро, поскольку получение только одного случайного числа по сравнению с количеством битов в нем быстрее. теперь это полностью зависит от вашего двоичного преобразования.
SMP Safe (т.е. самый быстрый способ, возможный в наши дни) и хорошие биты
Обратите внимание на использование атрибута [ThreadStatic], этот объект автоматически обрабатывает новые потоки, без блокировки. Это единственный способ обеспечить высокопроизводительный случайный выбор без блокировки SMP.
http://blogs.msdn.com/pfxteam/archive/2009/02/19/9434171.aspx
Вы можете сгенерировать случайное число и продолжить сдвиг вправо и проверить младший значащий бит, чтобы получить случайные биты, вместо выполнения операции модификации.
Если я правильно помню, младшие значащие биты обычно имеют "менее случайный" distribution for most pseuodo random number generators, so using modulo and/or each bit in the generated number would be bad if you are worried about the distribution.
(Maybe you should at least google what Knuth says...)
If that holds ( and its hard to tell without knowing exactly what algorithm you are using) just use the highest bit in each generated number.
Насколько большим должно быть количество сгенерированных битов? Если он не превышает нескольких миллионов, и имея в виду, что вы не используете генератор для криптографии, то я думаю, что самым быстрым способом было бы предварительно вычислить большой набор целых чисел с правильным распределением, преобразовать его в текст файл следующим образом:
unsigned int numbers[] =
{
0xABCDEF34, ...
};
, а затем скомпилируйте массив в свою программу и просматривайте его по одному номеру за раз.
Таким образом, вы получаете 32 бита с каждым вызовом (на 32-битном процессоре), время генерации равно максимально короткие, потому что все числа генерируются заранее, а распределение контролируется вами. Обратной стороной является, конечно, то, что эти числа вовсе не случайны, что в зависимости от того, для чего вы используете ГПСЧ, может иметь значение, а может и не иметь значения.
Просто прочтите часть памяти - возьмите битовую часть необработанной памяти. Это будет довольно случайным образом.
В качестве альтернативы, сгенерируйте большое случайное int x и просто используйте битовые значения.
for(int i = (bitcount-1); i >= 0 ; i--) bin += x & (1 << i);
Вот очень быстрый алгоритм, который я написал на Java на основе алгоритма XORShift Джорджа Марсаглии: дает вам 64 бита за раз!
/**
* State for random number generation
*/
private static volatile long state=xorShift64(System.nanoTime()|0xCAFEBABE);
/**
* Gets a long random value
* @return Random long value based on static state
*/
public static final long nextLong() {
long a=state;
state = xorShift64(a);
return a;
}
/**
* XORShift algorithm - credit to George Marsaglia!
* @param a Initial state
* @return new state
*/
public static final long xorShift64(long a) {
a ^= (a << 21);
a ^= (a >>> 35);
a ^= (a << 4);
return a;
}