самый быстрый способ генерировать случайные биты

Вы можете выбрать все записи из основной таблицы, для которой Loc_id не существует в таблице местоположений с условием NOT EXISTS и коррелированным подзапросом:

SELECT m.*
FROM master m
WHERE NOT EXISTS (
    SELECT 1 FROM locations l WHERE l.Loc_id = m.UserLocation
)
10
задан dagw 15 May 2009 в 08:41
поделиться

9 ответов

Взгляните на Boost.Random , особенно boost :: uniform_int <> .

.
4
ответ дан 3 December 2019 в 23:51
поделиться

Как вы говорите, просто генерируйте случайные целые числа.
Тогда у вас есть 32 случайных бита с равновероятными единицами и нулями.

Получите биты в цикле:

for (int i = 0; i < 32; i++)
{
  randomBit = (randomNum >> i) & 1
  ...
  // Do your thing
}

Повторите это столько раз, сколько вам нужно, чтобы получить правильное количество битов.

3
ответ дан 3 December 2019 в 23:51
поделиться

преобразовать случайное число в двоичное
Почему бы не получить только одно число (подходящего размера, чтобы получить достаточно битов), а затем преобразовать его в двоичное. На самом деле вы получите биты из случайного числа, что означает, что они также являются случайными.

Нулевые и единицы также имеют вероятность 50%, поскольку взятие всех чисел от 0 до некоторого ограничения 2 ^ n и подсчет количества нулей и единицы равны>, что означает, что вероятность наличия нулей и единиц одинакова.

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

5
ответ дан 3 December 2019 в 23:51
поделиться

SMP Safe (т.е. самый быстрый способ, возможный в наши дни) и хорошие биты

Обратите внимание на использование атрибута [ThreadStatic], этот объект автоматически обрабатывает новые потоки, без блокировки. Это единственный способ обеспечить высокопроизводительный случайный выбор без блокировки SMP.

http://blogs.msdn.com/pfxteam/archive/2009/02/19/9434171.aspx

1
ответ дан 3 December 2019 в 23:51
поделиться

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

0
ответ дан 3 December 2019 в 23:51
поделиться

Если я правильно помню, младшие значащие биты обычно имеют "менее случайный" 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.

http://en.wikipedia.org/wiki/Pseudo-random

0
ответ дан 3 December 2019 в 23:51
поделиться

Насколько большим должно быть количество сгенерированных битов? Если он не превышает нескольких миллионов, и имея в виду, что вы не используете генератор для криптографии, то я думаю, что самым быстрым способом было бы предварительно вычислить большой набор целых чисел с правильным распределением, преобразовать его в текст файл следующим образом:

unsigned int numbers[] =
{
  0xABCDEF34, ...
};

, а затем скомпилируйте массив в свою программу и просматривайте его по одному номеру за раз.

Таким образом, вы получаете 32 бита с каждым вызовом (на 32-битном процессоре), время генерации равно максимально короткие, потому что все числа генерируются заранее, а распределение контролируется вами. Обратной стороной является, конечно, то, что эти числа вовсе не случайны, что в зависимости от того, для чего вы используете ГПСЧ, может иметь значение, а может и не иметь значения.

0
ответ дан 3 December 2019 в 23:51
поделиться

Просто прочтите часть памяти - возьмите битовую часть необработанной памяти. Это будет довольно случайным образом.

В качестве альтернативы, сгенерируйте большое случайное int x и просто используйте битовые значения.

for(int i = (bitcount-1); i >= 0 ; i--) bin += x & (1 << i);
-3
ответ дан 3 December 2019 в 23:51
поделиться

Вот очень быстрый алгоритм, который я написал на 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;
}
2
ответ дан 3 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: