2011-01-12 4 views
2

В настоящее время я использую очень быстрый алгоритм XorShift:Что такое быстрая замена по модулю для генерации случайных чисел?

inline uint r() { 
    static uint y = 2463534242u; // seed 
    y ^= (y<<13); 
    y ^= (y>>17); 
    y ^= (y<<5); 
    return y; 
} 

Теперь я хочу, чтобы генерировать целое число от интервала [0, п). Конечно, я могу это сделать:

r() % n 

Но это медленно. Есть ли более быстрый способ?

PS Допустимы небольшие неравенства в вероятностях разного числа в интервале.

+1

Это xorshift 'r' функция выглядит как http://xkcd.com/221/. – user562374

+0

Как вы определяете медленное? Для этого может использоваться инструкция DIV, и она запускается в 26 тактовых циклах на современном x86 (i7) и 40 на Core2. –

+0

Это по-прежнему сильно отличается от тактовых циклов, необходимых для r(). –

ответ

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