什么是随机数生成的快速模替换?
目前我正在使用非常快的 XorShift 算法:
inline uint r() {
static uint y = 2463534242u; // seed
y ^= (y<<13);
y ^= (y>>17);
y ^= (y<<5);
return y;
}
现在我想从区间 [0, n) 生成一个整数。我当然可以这样做:
r() % n
但这很慢。有更快的方法吗?
聚苯乙烯 区间内不同数字的概率存在微小的不平等是可以接受的。
Currently I'm using a very fast XorShift algorithm:
inline uint r() {
static uint y = 2463534242u; // seed
y ^= (y<<13);
y ^= (y>>17);
y ^= (y<<5);
return y;
}
Now I want to generate an integer from interval [0, n). Of course I can do this:
r() % n
But this is slow. Is there a faster way?
PS
A small inequalities in probabilities of different numbers in the interval are acceptable.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您的
n
低于模板的编译器递归深度,您可以尝试 生成随机排列的最快方法,并让编译器通过更轻量级的操作来优化模数。对于较大的
n
您可以使用 https://arxiv.org/ 中的方法pdf/1805.10941.pdf ,其中大多数时候除法运算被乘法(加上小的按位运算)取代。If your
n
is below the compiler recursion depth for templates, you can try the approach from The fastest way to generate a random permutation and let the compiler optimize the modulo with more lightweight operations.For larger
n
you can use the approach from https://arxiv.org/pdf/1805.10941.pdf , where most of the time the division operation is replaced with multiplication (plus small bitwise ops).