[英]Clip random integer to a range of values without using division/modulo
这样可以做到:
int clamp(int rnd, int min, int max)
{
return min + rnd % (max - min + 1);
}
不使用除法就可以做到吗? 返回值不一定必须匹配,但是必须保留统一的分布。
rnd
, min
和max
是任意整数。 在我的情况下, rnd
是一个随机整数。
一种可能的解决方案是使用std :: ldexp将[0...1)
范围转换为double
,然后相乘,但是我想知道是否有一个不涉及浮点和/或除法的简单解决方案。
如果根据注释,您有一个32位int和rnd输入均匀地分布在-2 ^ 31和2 ^ 31之间,则可以将输出计算为min + ((((long long)max-(long long)min) * (unsigned long)rnd))>>32
,有效地将rnd缩放为0..1,将值缩放为min..max。 自从您撰写本文以来,您并不关心标准,因此我并不特别关注已签名/未签名的转换做法和警告。 只是给出了一个大致的想法-先乘后移而不是除法。
int clamp(uint32_t rnd, int min, int max)
{
return min + (1ull*rnd*(max - min + 1)) >> 32;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.