В настоящее время я использую очень быстрый алгоритм XorShift:Что такое быстрая замена по модулю для генерации случайных чисел?
inline uint r() {
static uint y = 2463534242u; // seed
y ^= (y<<13);
y ^= (y>>17);
y ^= (y<<5);
return y;
}
Теперь я хочу, чтобы генерировать целое число от интервала [0, п). Конечно, я могу это сделать:
r() % n
Но это медленно. Есть ли более быстрый способ?
PS Допустимы небольшие неравенства в вероятностях разного числа в интервале.
Это xorshift 'r' функция выглядит как http://xkcd.com/221/. – user562374
Как вы определяете медленное? Для этого может использоваться инструкция DIV, и она запускается в 26 тактовых циклах на современном x86 (i7) и 40 на Core2. –
Это по-прежнему сильно отличается от тактовых циклов, необходимых для r(). –